コピーコンストラクション関数と等号付与のこと


1.私は初心者です.間違いを犯します.
 32 class Child {
 33     int i;
 34     //Member m;
 35 public:
 36     Child() : i(0) {
 37         cout << "Child()" << endl;
 38     }
 39     
 40     Child(const Child& c) : Parent(c),  i(c.i) {
 41         cout << "Child(const Child&)" << endl;
 42     }
 43     
 44     Child& operator=(const Child& c) {
 45         i = c.i;
 46         cout << "Child& operator=(const Child&)" << endl;
 47     }
 48     ~Child() {
 49         cout << "~Child()" << endl;
 50     }
 51 };
 52 
 53 int main() {
 54     Child c;
 55 
 56     Child c2 = c;
 57     
 58 }

このコードを実行すると、得られた結果から、コード行Child c 2=c;付与記号の内容は実行されず、コピーコンストラクション関数の内容が実行されます.どうしてですか.これは私という初心者が犯しやすい間違いです.Child c 2=c;割り当て記号が使用されていますが、ここではオブジェクトc 2の定義、すなわち、オブジェクトc 2は構築されていない前に割り当てられないため、コンパイラは56行のコードでコピーコンストラクション関数を呼び出し、私が理解している割り当て操作ではありません.したがって,このような二義性を回避するために,オブジェクトの定義については,以下のコードのようにc++で提案された定義方式を用いることが望ましい.
 53 int main() {
 54     Child c;
 55 
 56     Child c2(c);
 57     
 58 }

2.継承間のコンストラクション関数の使用方法
  1 #include <iostream>
  2 using namespace std;
  3 
  4 class Parent {
  5     int i;
  6 public:
  7     Parent() : i(0) {
  8         cout << "Parent()" << endl;
  9     }
 10     Parent(const Parent& p) : i(p.i) {
 11         cout << "Parent(const Parent&)" << endl;
 12     }
 13     ~Parent() {
 14         cout << "~Parent()" << endl;
 15     }
 16 };
 17 
 18 class Member {
 19     int i;
 20 public:
 21     Member() : i(0) {
 22         cout << "Member()" << endl;
 23     }
 24     Member(const Member& m) : i(m.i) {
 25         cout << "Member(const Member&)" << endl;
 26     }
 27     ~Member() {
 28         cout << "~Member()" << endl;
 29     }
 30 };
 31 
 32 class Child : public Parent {
 33     int i;
 34     Member m;
 35 public:
 36     Child() : i(0) {
 37         cout << "Child()" << endl;
 38     }
 39     /*
 40     Child(const Child& c) : Parent(c),  i(c.i) {
 41         cout << "Child(const Child&)" << endl;
 42     }
 43     */
 44     Child& operator=(const Child& c) {
 45         i = c.i;
 46         cout << "Child& operator=(const Child&)" << endl;
 47     }
 48     ~Child() {
 49         cout << "~Child()" << endl;
 50     }
 51 };
 52 
 53 int main() {
 54     Child c;
 55 
 56     Child c2(c);
 57 }

実行結果:
参照
Parent()
Member()
Child()
Parent(const Parent&)
Member(const Member&)
~Child()
~Member()
~Parent()
~Child()
~Member()
~Parent()
クラスChildのコピーコンストラクション関数を注釈しているため、コンパイラはデフォルトでクラスChildのコピーコンストラクション関数を生成します.この関数には、親クラスのコピーコンストラクション関数を呼び出し、オブジェクトメンバー変数が存在する場合、メンバー変数のコピーコンストラクション関数を呼び出すしかありません.では、Childを定義するコピー構造関数を表示したら?