深くC++の中でstructとclassの区別の分析

3174 ワード

一、C++のstructはCのstructを拡張し、異なるデータ型を含むデータ構造だけでなく、多くの機能を取得しています.
structにはメンバー関数が含まれますか?できる!structは継承できますか?できる!structはマルチステートを実現できますか?できる!!! 
最も本質的な違いは、デフォルトのアクセス制御です.1)デフォルトの継承アクセス権限です.structはpublicで、classはprivateです.
次のコードを書きます.
 
  
struct A
{
  char a;
};
struct B : A
{
  char b;
};

このときBはpublicがAを継承しています.上記のstructをclassに変更すると、BはprivateがAを継承します.これがデフォルトの継承アクセス権です.だから私たちは普段クラス継承を書くとき、通常このように書きます.
struct B:public Aは、デフォルトのprivateではなくpublic継承であることを示すためです.
もちろん、デフォルトがpublic継承なのかprivate継承なのかは、ベースクラスではなくサブクラスに依存します.structはclassを継承することができ、同じclassもstructを継承することができます.デフォルトの継承アクセス権は、サブクラスがstructを使用しているのかclassを使用しているのかを見ることです.次のようになります.
struct A{};class B : A{};//private継承struct C:B{};//public継承
2)structはデータ構造の実装体として、デフォルトのデータアクセス制御はpublicであり、classはオブジェクトの実装体として、デフォルトのメンバー変数アクセス制御はprivateである.
3)「class」というキーワードは、「typename」のようにテンプレートパラメータを定義するためにも使用されます.ただし、キーワード「struct」はテンプレートパラメータを定義するために使用されません.
4)やはり上述したように,C++のstructはCのstructの拡張であり,拡張である以上,過去のCのstructが持つべきすべての特性と互換性を持たなければならない.たとえば、次のように書くことができます.
struct A/structを定義する
{
 char c1;
 int  n2;
 double db3;
};
A a={'p',7,3.1415926};//定義時直接付与
すなわちstructは定義時に{}で初期値を付与することができる.
上のstructに構造関数(または虚関数)を追加すると、structも{}で初期値を付与できません.確かに、{}のように初期値を付与するのは、1つの初期化リストでデータを順番に初期化するだけで、A a={'p',7}と書くと、c 1,n 2は初期化され、db 3は初期化されない.このような簡単なcopy操作は、オブジェクトに置くべきではなく、簡単なデータ構造でのみ発生します.コンストラクション関数または虚関数を追加するとstructはオブジェクトの特性をより反映し、この{}操作を有効にしません.実際,このような関数を加えることでクラスの内部構造が変化する.普通のメンバー関数を追加しますか?{}は依然として使用可能であることがわかります.実際には、一般的な関数をデータ構造のアルゴリズムとして理解することができます.これは、データ構造の特性を破るものではありません.虚関数と普通のメンバー関数の違いについては、具体的に文章を書いて議論します.
そこで,ここではstructが{}で初期値を付与しようとしても,クラスの特性ではなくデータ機構をより体現するために多くの制約条件を満たさなければならないことを見出した.ではなぜstructをclassに変更するだけでは使えないのでしょうか.実は問題はちょうど私たちが前に話した――アクセス制御です!何を忘れたの?はい、structをclassに変更すると、アクセス制御がpublicからprivateに変わります.もちろん{}で初期値を割り当てることはできません.publicを加えると、classも{}使えるし、structと変わらない!!!
上記の違いから,structはデータ構造の実装体と見なすのに適しており,classはオブジェクトの実装体と見なすのに適していることが分かる.
二、カッコでclassとstructを初期化する構造関数を定義した場合、カッコで初期化することはできません
コンストラクション関数が定義されていない場合、structはカッコで初期化できます.
コンストラクション関数が定義されず、すべてのメンバー変数がpublicである場合は、カッコで初期化できます.
デフォルトアクセスclassのデフォルトのメンバーアクセスはprivateであり、structはpublicです.
継承方式class継承のデフォルトはprivate継承であり、struct継承のデフォルトはpublic継承である.
次のコードを見てみましょう(コンパイラから与えられたエラー情報を見てください):
 
  
class T1
{
 public:
  void f()
  {
   cout<  }
 int x,y;
};
struct T2
{
 int x;
 void f(){cout<};
struct TT1 : T1
{
};
class TT2 : T2
{
};
int main()
{
 TT1 t1;
 TT2 t2;
 t1.f();
 t2.f();
}

テンプレートについては、タイプパラメータの前にclassまたはtypenameを使用できますが、structを使用すると意味が異なり、structの後ろには「non-type template parameter」が付いていますが、classまたはtypenameの後ろにはタイプパラメータが付いています.
template
void f(X x)
{
}
//エラーメッセージ:d:codecpptestcpptestcpptest.cpp(33) : error C2065: 'X' : undeclared identifier