[セットトップ]c++Constructor FAQ続き


この章では、コンパイラが宣言したりデフォルトのコンストラクション関数を定義したりするタイミングについて説明します.定義を与えなくてもデフォルトのコンストラクション関数の意味を宣言する理由も説明されています.
Q:コンパイラはいつ暗黙的にデフォルトのコンストラクタを定義しますか.
答え:暗黙的に宣言されたデフォルトコンストラクタは、コンパイラが必要とする場合にのみ暗黙的にデフォルトコンストラクタを定義します.以下の場合に限ってそれが必要です.
1、ダミーメンバー関数を持つクラス.虚のメンバー関数を持つクラスには必ずnon-trivialの構造関数があります.non-trivialのコンストラクション関数は、ユーザ定義またはコンパイラ暗黙的に定義されたコンストラクション関数である可能性があります.また、vptrのアドレスなどの正確な初期化を提供する責任がある.
2、Default Constructor付きMember Class Object
3、Default Constructor付きBase Class
4、Virtual Bass ClassがあるClass
以上の詳細は(深さ探索C++オブジェクトモデル)を参照してください.
Q:コンパイラはTrivialコンストラクタを暗黙的に宣言します.定義されていなくても?
答え:一定の条件の下で、コンパイラはデフォルトの構造関数を暗黙的に宣言しますが、定義しません.このような構造関数はいわゆるtrivialである.多くのc++プログラマーはtrivialメンバー関数の概念に困惑している.
コンパイラが関数がデフォルトで定義されないことを知っている場合、なぜこのコンパイラはデフォルトの構造関数を暗黙的に宣言するのでしょうか.何か目的がありますか?
まず、最初に心に刻まなければならないことは、暗黙的な宣言が概念的であり、コンパイラがあなたのコードにいわゆる宣言コードを挿入することはありません.より正確には、コンパイラ、コネクタ、プログラムが構造関数が宣言されているように表現されているはずです.実際、コンパイラはクラスのタイプ情報記録にbitsを簡単に設定して、いわゆるタイプにデフォルトの構造関数があることを示す宣言を設定しています.
今、最も重要な問題に戻りましょう.なぜ面倒な暗黙的な声明がありますか.結局、Cはそのstructやunionにこのようなメカニズムを提供する必要はありません.事実は暗黙的に契約があるようなルールを宣言している.各暗黙的な声明は、契約の条項のように、確定的なクラスがどのように使用されるかを宣言しています.コンパイラがこの特殊なメンバー関数を暗黙的に宣言すると、ユーザーにいくつかの権限が与えられます.それに比べて、コンパイラがメンバー関数を暗黙的に宣言しない場合、クラスの使用が制限されます.次のコードを考慮します.
struct Blocked
{
public:
Blocked(const Blocked&);
};
copy-constructorの存在は、コンパイラが暗黙的に宣言しないことを知っているに違いありません.このクラスにはデフォルトのコンストラクション関数が暗黙的または表示されていないため、クラスメンバーを次のようにインスタンス化することはできません.
Blokced b; //error, no default constructor available
Blocked *p = new Blocked; //error
は暗黙的に宣言するメカニズムがなく、プログラマはインスタンス化が必要なクラスごとに手動でコンストラクタを追加し、コンストラクタをコピーし、コンストラクタを割り当て、コンストラクタを解析しなければなりません.次のPODタイプは、この観点を証明しています.
struct Date
{
int day, month, year;
};
コンパイラの食事は、次のメンバー関数を宣言します.
A trivial default constructor
A trivial copy constructor
A trivial assignment operator
A trivial destructor
これらの声明は、次のようにDateを使用することができます.
Date d; //implicit declaration of default ctor and dtor allow this
Date * pdate= new Date; //same here
Date d2(d); //implicit copy ctor declaration allows this
*pdate=d2; //implicit assignment operator declaration allows this
delete pdate; //implicit dtor declaration allows this

trivialメンバー関数はC++プログラミングにおいて非常に重要であり、どれだけ面倒を省くことができるかを理解するために、宣言を表示してみましょう.
struct Date
{
int day, month, year;
private:
 ~Date(); //declared but not defined
 Date(const Date&); //ditto
};
Date d; //error, no default ctor
Date * pdate= new Date; //same error here
Date d2(d); //error, no accessible copy ctor

上のコードはコンパイルできません.