一. 什么是拷贝构造函数
首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:
而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。
下面看一个类对象拷贝的简单例子。
- #include <iostream>
- using namespace std;
-
- class CExample {
- private:
- int a;
- public:
-
- CExample(int b)
- { a = b;}
-
-
- void Show ()
- {
- cout<<a<<endl;
- }
- };
-
- int main()
- {
- CExample A(100);
- CExample B = A;
- B.Show ();
- return 0;
- }
运行程序,屏幕输出100。从以上代码的运行结果可以看出,系统为对象 B 分配了内存并完成了与对象 A 的复制过程。就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。
下面举例说明拷贝构造函数的工作过程。
- #include <iostream>
- using namespace std;
-
- class CExample {
- private:
- int a;
- public:
-
- CExample(int b)
- { a = b;}
-
-
- CExample(const CExample& C)
- {
- a = C.a;
- }
-
-
- void Show ()
- {
- cout<<a<<endl;
- }
- };
-
- int main()
- {
- CExample A(100);
- CExample B = A;
- B.Show ();
- return 0;
- }
CExample(const CExample& C) 就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种特殊的
构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量
。
二. 拷贝构造函数的调用时机
在C++中,下面三种对象需要调用拷贝构造函数!
1. 对象以值传递的方式传入函数参数
- class CExample
- {
- private:
- int a;
-
- public:
-
- CExample(int b)
- {
- a = b;
- cout<<"creat: "<<a<<endl;
- }
-
-
- CExample(const CExample& C)
- {
- a = C.a;
- cout<<"copy"<<endl;
- }
-
-
- ~CExample()
- {
- cout<< "delete: "<<a<<endl;
- }
-
- void Show ()
- {
- cout<<a<<endl;
- } <li class="alt" style="box-sizing: border-box; margin-left: 40px; list-style: decimal; border-top: none;%2