面向对象程序设计-C++_课时26拷贝构造Ⅰ_课时27拷贝构造Ⅱ

Posted 邓戈麟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象程序设计-C++_课时26拷贝构造Ⅰ_课时27拷贝构造Ⅱ相关的知识,希望对你有一定的参考价值。

 

复制构造函数,不是字节对字节的拷贝,而是成员对成员的拷贝

 

构造函数,参数是引用一个类

正确

 

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 static int objectCount = 0;
 6 
 7 class HowMany
 8 {
 9 public:
10     HowMany() { objectCount++; print("HowMany()"); }//构造函数,没有参数
11     HowMany(int i) { objectCount++; print("HowMany(int)"); }//构造函数,参数是一个int
12     HowMany(const HowMany& o) { objectCount++; print("HowMany(HM)"); }//构造函数,参数是引用一个类
13     void print(const string& msg = "")
14     {
15         if (msg.size() != 0)
16         {
17             std::cout << msg << ": ";
18         }
19         std::cout << "objectCount="
20             << objectCount << std::endl;
21     }
22     ~HowMany()
23     {
24         objectCount--;
25         print("~HowMany()");
26     }
27 };
28 
29 HowMany f(HowMany x)
30 {
31     std::cout << "begin of f" << std::endl;
32     x.print("x argument inside f()");
33     std::cout << "end of f" << std::endl;
34     return x;
35 }
36 
37 void main()
38 {
39     HowMany h;
40     h.print("after construction of h");
41     
42     HowMany h2 = f(h);
43     //HowMany h2 = h;
44     //HowMany h2(10);//构造函数,参数是一个int
45     //HowMany h2(h);//构造函数,参数是一个类
46 
47     h.print("after call to f()");
48     
49     system("pause");
50 }

 

构造函数,参数是新建一个类,形成死循环

错误

 

1>main.cpp(13): error C2652: “HowMany”: 非法的复制构造函数: 第一个参数不应是“HowMany”
1> main.cpp(8): note: 参见“HowMany”的声明
1>main.cpp(13): error C2333: “HowMany::HowMany”: 函数声明中有错误;跳过函数体
1>main.cpp(44): error C2440: “return”: 无法从“HowMany”转换为“HowMany”
1> main.cpp(44): note: 由于复制构造函数不明确或没有可用的复制构造函数,因此无法复制构造 class“HowMany”
1>main.cpp(52): error C2664: “HowMany f(HowMany)”: 无法将参数 1 从“HowMany”转换为“HowMany”
1> main.cpp(52): note: 由于复制构造函数不明确或没有可用的复制构造函数,因此无法复制构造 class“HowMany”

 

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 static int objectCount = 0;
 6 
 7 class HowMany
 8 {
 9 public:
10     HowMany() { objectCount++; print("HowMany()"); }//构造函数,没有参数
11     HowMany(int i) { objectCount++; print("HowMany(int)"); }//构造函数,参数是一个int
12 
13     HowMany(HowMany o) { objectCount++; print("HowMany(HM)"); }//构造函数,错误,参数是新建一个类,形成死循环
14 
15     //1>main.cpp(13) : error C2652 : “HowMany” : 非法的复制构造函数 : 第一个参数不应是“HowMany”
16     //    1>  main.cpp(8) : note : 参见“HowMany”的声明
17     //    1>main.cpp(13) : error C2333 : “HowMany::HowMany” : 函数声明中有错误;跳过函数体
18     //    1>main.cpp(44) : error C2440 : “return” : 无法从“HowMany”转换为“HowMany”
19     //    1>  main.cpp(44) : note : 由于复制构造函数不明确或没有可用的复制构造函数,因此无法复制构造 class“HowMany”
20     //    1>main.cpp(52) : error C2664 : “HowMany f(HowMany)” : 无法将参数 1 从“HowMany”转换为“HowMany”
21     //    1>  main.cpp(52) : note : 由于复制构造函数不明确或没有可用的复制构造函数,因此无法复制构造 class“HowMany”
22 
23     void print(const string& msg = "")
24     {
25         if (msg.size() != 0)
26         {
27             std::cout << msg << ": ";
28         }
29         std::cout << "objectCount="
30             << objectCount << std::endl;
31     }
32     ~HowMany()
33     {
34         objectCount--;
35         print("~HowMany()");
36     }
37 };
38 
39 HowMany f(HowMany x)
40 {
41     std::cout << "begin of f" << std::endl;
42     x.print("x argument inside f()");
43     std::cout << "end of f" << std::endl;
44     return x;
45 }
46 
47 void main()
48 {
49     HowMany h;
50     h.print("after construction of h");
51     
52     HowMany h2 = f(h);
53     //HowMany h2 = h;
54     //HowMany h2(10);//构造函数,参数是一个int
55     //HowMany h2(h);//构造函数,参数是一个类
56 
57     h.print("after call to f()");
58     
59     system("pause");
60 }

 

以上是关于面向对象程序设计-C++_课时26拷贝构造Ⅰ_课时27拷贝构造Ⅱ的主要内容,如果未能解决你的问题,请参考以下文章

面向对象程序设计-C++_课时13初始化列表

面向对象程序设计-C++_课时28静态对象_课时29静态成员

面向对象程序设计-C++_课时19const_课时20不可修改的

网易云课堂_Linux操作系统入门(嵌入式开发零基础Ⅰ)_课时13文件增删及拷贝

面向对象程序设计-C++_14对象组合_课时15继承

面向对象程序设计-C++_课时21引用