C++中拷贝构造函数调用时机通常有三种情况
1、使用一个已经创建完毕得对象来初始化一个新对象
2、值传递的方式给函数参数传值
3、以值方式返回局部对象
下面举例说明:
class student{
public:
student(){
cout<<"无参构造函数"<<endl;
age = 0;
}
student(int aage){
cout<<"有参构造函数"<<endl;
age = aage;
}
student(const student&s1){
cout<<"拷贝构造函数"<<endl;
age = s1.age;
}
int age;
~student(){
cout<<"解析构造函数"<<endl;
}
}
上面写了三个构造函数,下面分别对三种情况讨论
1、使用一个已经创建完毕的对象来初始化一个新对象
void test01(){
student s1(10);
student s2(s1);
}
这个在main函数中运行是如下结果:
可见,在运行 student s1(10); 时,调用了一次有参构造函数,接着运行 student s2(s1); 时,调用一次拷贝构造函数,最后 void test01() 运行结束,两个类被解析,输出两个解析构造函数。
2、值传递的方式给函数参数传值
void doWork(student s){
}
void test02(){
student s1;
doWord(s1);
}
运行结果如下:
可见,运行 student s1; 是无参构造函数, 运行 doWord(s1); 时,是拷贝构造函数,因为运行doWord时,用值传递的方式把s1给了doWord参数,而值传递的本质就是拷贝出来一个副本。
3、以值方式返回局部对象
student doWork2() {
student s1;
cout<<(int*)&s1<<endl;
return s1;
}
void test03() {
student s2 = doWork2();
cout<<(int*)&s2<<endl;
}
在main函数运行test03()结果如下:
同样的,也是运行student s1; 时,是无参构造函数,而运行return s1; 时,是以值的方式返回,并不是直接返回s1,而是按照s1拷贝一个新的对象,将这个新的对象返回.
下面我们做一个验证,在程序中分别打印s1和s2的地址看看:
可见,s1和s2它们的地址虽然离得很近,但确实不一样。
int main(){
test01();
test02();
test03();
system("pause");
return 0;
}