一、什么是拷贝构造函数
首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。
下面看一个类对象拷贝的简单例子。
运行程序,屏幕输出100。从以上代码的运行结果可以看出,系统为对象 B 分配了内存并完成了与对象 A 的复制过程。就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。
CExample(const CExample& C) 就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种 特殊的 构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个 引用变量。
二、拷贝构造函数的调用时机
1. 当函数的参数为类的对象时
首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:
int a=100; int b=a;
下面看一个类对象拷贝的简单例子。
#include<iostream> using namespace std; class CExample { private:int a; public://构造函数CExample(int b){a=b;printf("constructor is called\n");}//拷贝构造函数CExample(const CExample & c){a=c.a;printf("copy constructor is called\n");}//析构函数~CExample(){cout<<"destructor is called\n";}void Show(){cout<<a<<endl;} }; int main() {CExample A(100);CExample B=A;B.Show(); return 0; }
CExample(const CExample& C) 就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种 特殊的 构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个 引用变量。
二、拷贝构造函数的调用时机
1. 当函数的参数为类的对象时
#include<iostream> using namespace std; class CExample { private:int a; public:CExample(int b){a=b;printf("constructor is called\n");}CExample(const CExample & c){a=c.a;printf("copy constructor is called\n");}~CExample(){cout<<"destructor is called\n";}void Show(){cout<<a<<endl;} }; void g_fun(CExample c) {cout<<"g_func"<<endl; } int