structとclassの違い


一.関数パラメータ:
1.伝達値:
値を渡すと構造体パラメータがコピーされ、関数内で構造体メンバーを変更して呼び出しパラメータを変更することはできません.この場合,構造体パラメータのコピーに関わるため,プログラム空間や時間効率に影響を及ぼすため,この方法はほとんど用いられない.
2.送信ポインタ:
ポインタは直接構造体のヘッダアドレスを関数体に渡し、関数体ではポインタで構造体メンバーを参照することで、構造体パラメータメンバーの値に実際の影響を与えることができ、このような使い方は効率が高く、よく採用されている.
次のようになります.
struct tagSTU{
  char name[20];
  int age;
}STUDENT;
void fun(STUDENT *pStu){
  cout<<pStu->name<<pStu->age<<endl;
}

二.一部のバージョンのC言語コンパイラでは、int、char、ポインタなどの基本データ型にのみ戻り、構造体は値では戻りません.一部のバージョンのCコンパイラでは、構造体変数を直接返すこともできます.
C++は構造体変数を直接返すことができる.
構造体変数を直接返すには、次のようにします.
typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;
STUDENT fun();
int _tmain(int argc, _TCHAR* argv[])
{
STUDENT p=fun();
printf("p.name=%s",p.name);
return 0;
}
STUDENT fun()
{
STUDENT stu;
stu.age=18;
strcpy(stu.name,"xiaoming");
return stu;
}

ポインタで構造体を返すには、次のようにします.
STUDENT* fun()
{
STUDENT* p=malloc(sizeof(STUDENT));
p->age=18;
strcpy(p->name,"xiaoming");
return p;
}

三.構造体とクラスの比較
構造は、キーワードstructで宣言されるカスタムデータ型です.クラスと同様に、コンストラクション関数、定数、フィールド、メソッド、プロパティ、インデックス、演算子、ネストタイプなども含まれますが、構造は値タイプです.1.構造の構造関数とクラスの構造関数が異なる.a.構造は明示的な無パラメータ構造関数を含んではならない.構造メンバーは、デフォルト値として自動的に初期化されます.b.構造には、base(argument-list);2.構造内のインスタンスフィールドのメンバーでは、宣言時に初期化値を割り当てることはできません.3.構造タイプが宣言されたら、new演算子を使用して構築オブジェクトを作成するか、newキーワードを使用しないことができます.newを使用しない場合、すべてのフィールドを初期化する前に、フィールドは割り当てられていない状態を維持し、オブジェクトは使用できません.4.構造は継承をサポートしていません.つまり、1つの構造は別の構造またはクラスから継承できず、1つのクラスのベースクラスとして使用できません.しかし,構造はベースクラスOBJECTから継承される.構造はインタフェースを実現することもできる.
5.構造はスタックに作成され、値タイプである.クラスはスタックに作成され、参照タイプです.
6.structのデフォルトはpublic、classのデフォルトはprivateです.
四.まとめ
構造体:
「デフォルトのコンストラクション関数はありませんが、コンストラクション関数を追加できます」「コンストラクション関数がありません」「abstractとsealedがありません(継承できませんので)」「protected修飾子がありません」「new初期化を適用できません」「構造でインスタンスフィールドを初期化するのはエラーです」
クラス:
「デフォルトのコンストラクション関数がある」「構造関数がある」「abstractとsealedを使用可能」「protected修飾子がある」「new初期化を使用する必要がある」
以下から抜粋:http://xiaoer-1982.iteye.com/blog/501988