C++コンストラクタを呼び出す方法

2459 ワード

今日は面白い問題に出会ったが,この問題はもう初めてつまずいたわけではない.ここに置いて、自分に注意すると同時に、C++を勉強している友达もきっと同じ問題を経験すると信じています.
それとも古いスタイルなのか、まずコードを見てみましょう.
 
 1 class A
 2 {
 3 public:
 4   A(int a)
 5   {
 6   }
 7 };
 8 class B : public A
 9 {
10 
11 };
12 
13 int main()
14 {
15  B b(); 
16 }

コンパイラは、コンストラクション関数を自動的に合成するときに、サブクラスのデフォルトコンストラクション関数を呼び出します.しかし、私はわざとサブクラスAのコンストラクタを修正して、コンパイラがAのパラメータのないデフォルトコンストラクタを合成しないようにして、Bのデフォルトコンストラクタが合成できないようにしました.
私はこのような間違いをテストしたいと思っています.上のコードがスムーズにコンパイルできることに気づきました.
しかし、私は15行目のコードB();B bに変更する.コンパイルエラーが正常にトリガーされたことがわかりました.
 
どうしてですか.
C++でコンストラクション関数を呼び出す方法は次のとおりです.
A a = A();//デフォルトコンストラクタの呼び出し
A a = A(xx);//パラメータ付きコンストラクション関数の呼び出し
A a(xx);//パラメータ付きコンストラクション関数の簡略化形式を呼び出す
A a;//デフォルトのコンストラクション関数の簡略化形式を呼び出す
 
私たちが勉強するときは、勝手に知識を移すことはできません.
上のコードの15行目B()実は、パラメータがなく、Bタイプの変数を返す関数が宣言されています.プロセス全体にクラスB変数の定義がないため、コンパイラをトリガしてBのコンストラクタを合成しないため、エラーは報告されません.
デフォルトのコンストラクション関数を呼び出す方法は2つしかありません.
A a = A();
またはその略記形式:
A a;
一方、パラメータ付きの簡略形式は、パラメータなしの構造式には適用できません.
A a();
上の文は、パラメータのない関数宣言として認識され、関数名はaです.