私の (かなりの) 経験では、これはほとんどの場合、C++ に手探りで進んだ C プログラマーを示しています。これらがあなたのクラスからのメモである場合、それは良い前兆ではありません.
最初の「C」で、宣言した場合struct
struct StructName {
int a;
int b;
};
これは型名を宣言せず、構造体名のみを宣言したため、StructName のインスタンスを作成するには、次のように記述する必要があります。
struct StructName myStruct;
「StructName」部分を省略できるようにしたい場合は、typedef を使用する必要があります。
struct StructName { int a, b; };
typedef struct StructName StructName;
または、これらを 1 つのやや紛らわしいステートメントにまとめることができます。
typedef struct StructName { int a, b; } StructName;
struct
定義が何行も長い場合、型を定義した後に Struct のインスタンスを宣言できる 2 番目の C 構文と混同される可能性があるため、わかりにくいと言います。
struct StructName { int a, b; } StructName;
// aka
struct StructName { int a, b; };
struct StructName StructName; // local variable, StructName of type struct StructName
// declare a VARIABLE called StructName which is of type anonymous-struct.
struct { int a, b; } StructName;
これに関する 1 つの問題は、構造宣言で typedef された名前を使用できないことです。
// Won't compile because 'List' isn't declared until the end.
typedef struct list_structure { List* next; int a; } List;
// Won't compile because you have to remember to say 'struct List'
typedef struct List { List* next; int a; } List;
// Compiles
typedef struct list_structure { struct list_structure* next; int a; } List;
これは多くの C プログラマーを混乱させました。多くの C プログラマーが構造体の定義は
typedef struct tag_name { /* struct details */ } structname;
//e.g.
typedef struct tagStructName { int a, b; } StructName;
C++ はこれらすべてを継承しましたが、先に進んで typedef を暗黙的にしました。
// doesn't compile as C, will compile as C++
struct List {
List* next;
int a;
};
C としてコンパイルされていないことを確認するには: http://ideone.com/3r9TRy
C++ では、何かをクラスとして宣言することは、それを構造体として宣言することとまったく同じですが、1 つの変更があります。
class List {
List* next;
public:
int a;
};
あなたが書いたかのように正確です:
struct List {
private:
List* next;
public:
int a;
};
C++ では、astruct
と a の間に他に違いはありません。class