コピーコンストラクション関数と等号付与のこと
3551 ワード
1.私は初心者です.間違いを犯します.
このコードを実行すると、得られた結果から、コード行Child c 2=c;付与記号の内容は実行されず、コピーコンストラクション関数の内容が実行されます.どうしてですか.これは私という初心者が犯しやすい間違いです.Child c 2=c;割り当て記号が使用されていますが、ここではオブジェクトc 2の定義、すなわち、オブジェクトc 2は構築されていない前に割り当てられないため、コンパイラは56行のコードでコピーコンストラクション関数を呼び出し、私が理解している割り当て操作ではありません.したがって,このような二義性を回避するために,オブジェクトの定義については,以下のコードのようにc++で提案された定義方式を用いることが望ましい.
2.継承間のコンストラクション関数の使用方法
実行結果:
参照
Parent()
Member()
Child()
Parent(const Parent&)
Member(const Member&)
~Child()
~Member()
~Parent()
~Child()
~Member()
~Parent()
クラスChildのコピーコンストラクション関数を注釈しているため、コンパイラはデフォルトでクラスChildのコピーコンストラクション関数を生成します.この関数には、親クラスのコピーコンストラクション関数を呼び出し、オブジェクトメンバー変数が存在する場合、メンバー変数のコピーコンストラクション関数を呼び出すしかありません.では、Childを定義するコピー構造関数を表示したら?
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を定義するコピー構造関数を表示したら?