このページの内容 |
---|
C++の構造体 |
Cの構造体 |
構造体とクラス |
構造体の初期化 |
ありがたいスポンサー様 |
---|
C++においては、次のようにして構造体を定義する。特に、末尾のセミコロン(;)は忘れがちなので注意が必要。
// 定義 struct Point{ int x ; int y ; } ;
上のように定義すれば、Point型の変数を作成することができる。
Point point ; // C言語ではエラーになることに注意 struct Point point2 ; // これでもOK point.x = 100 ; point.y = 200 ; printf("x : %d\n", point.x); Point* p = &point ; printf("x : %d\n", p->x);
構造体は、自分自身へのポインタをメンバとして持つことができる。ただし、自分自身をオブジェクトとして持つことはできない。これは、構造体にはサイズ不明のオブジェクトをメンバとしては持てないからである。
struct List{
List* prev ;
List* next ;
};
C++との違いは、Pointという名前の構造体はstruct Point型として定義される点にある。そのため、上のPoint構造体のオブジェクトを作成するには
struct Point point ;
としなければならない。
これが面倒な場合やC++と同様に扱いたい場合は、typedefを用いて
typedef struct _Point{ int x ; int y ; } Point ;
とすれば、Point型を作成できる。次のように_Pointを省略して書くこともできる。また、型の前に * をつけることでポインタ型も作ることができる。
typedef struct{ int x ; int y ; } Point, *PPoint ;
typedefの意味が分からなければ、次のように分解してみると分かりやすい。
struct _Point{ int x ; int y ; } ; typedef struct _Point Point ; // struct _Point型 を Point型として扱う
ただし、自分自身へのポインタをメンバとして持つときは注意が必要。次のようにする必要がある。
typedef struct list{ struct list* prev ; struct list* next ; } List ;
前もってtypedefで型を定義しておく方法も可能である。
typedef struct list List ; struct list{ List* prev ; List* next ; }
C++では、構造体はメンバ関数やコンストラクタ・デストラクタを持つことができるように拡張された。実は、構造体はメンバがデフォルトで公開されているクラスである。つまり、
"stuct X{" = "class X{ public :"
となる。クラスと構造体の差異はそれだけである。
とはいえ、構造体はC言語と同じように扱えたほうが自然であり、メンバ関数を持たせたい場合はクラスとして定義するプログラマが多い。また、そのようにした方が、ソースコードの可読性が上がる(他人が読んだときに混乱が少ない。他人の中には、3ヵ月後の自分も含まれることに注意 :D)
構造体はメンバ変数を全て公開するようなときに使用するのがよいだろう。構造体はあくまで データ構造 を表現するときに使ったほうがよいということだ。メンバ関数やコンストラクタを構造体に持たせてはいけないというわけではないが、メンバ変数を設定するための関数群ととらえたほうがよいだろう。
構造体は次のように初期設定リストを使って初期化することができる。
Point pt = { 50, 100} ;
ただし、構造体にコンストラクタが定義されている場合は、初期設定リストを使用することはできない。