// 何时调用拷贝构造函数,何时会调用赋值操作?
//
记得Effective C++中有个条款是关于何时调用拷贝构造函数和赋值运算符的,觉得这个知识点挺有意思的,可能也是很多新手包括我自己比较疑惑的地方,所以就研究了一下,下面是分两种情况分别说明了何时调用拷贝构造函数和赋值运算符,当然调用拷贝构造函数的时机很多,这里仅仅列出了一种情况,这一种是比较容易跟赋值运算相混淆的,也就是下面的第3种情况。能想到的就这三种,有知道其它情况的童鞋希望告知,感激不尽。
以下情况都会调用拷贝构造函数:
1. 一个对象以值传递的方式传入函数体
2. 一个对象以值传递的方式从函数返回
3. 一个对象需要通过另外一个对象进行初始化。
代码段一:调用拷贝构造函数的一种情况
#include "stdafx.h"
#include<iostream>
using namespace std;
class A
{
public:
A(int a):i_data(a)
{
cout<<"constructor of A"<<endl;
}
A(const A& t)
{
cout<<"copy constructor"<<endl;
this->i_data = t.i_data;
}
void print() const
{
cout<<"i_data is:"<<(this->i_data)<<endl;
}
private:
int i_data;
};
int _tmain(int argc, _TCHAR* argv[])
{
A a(5);
A aa = a;
aa.print();
system("pause");
return 0;
}
程序的运行结果:
很明显这种情况调用了拷贝构造函数,因为A aa=a这个是用a来初始化aa,也就是aa在实例化的时候必然要调用构造函数,而且这个时候用另一个对象a来初始化aa,所以要调用拷贝构造函数。
调用赋值运算符的情况:
#include "stdafx.h"
#include<iostream>
using namespace std;
class A
{
public:
A(int a):i_data(a)
{
cout<<"constructor of A"<<endl;
}
A(const A& t)
{
cout<<"copy constructor"<<endl;
this->i_data = t.i_data;
}
void print() const
{
cout<<"i_data is:"<<(this->i_data)<<endl;
}
private:
int i_data;
};
int _tmain(int argc, _TCHAR* argv[])
{
A a(5);
A aa(10);
aa = a;
aa.print();
system("pause");
return 0;
}
程序运行的结果:
程序只在主函数中作了很小的改动,但是程序的运行方式发生了显著的变化。很明显这里没有调用拷贝构造函数,仅仅调用了构造函数和赋值运算符,aa=a执行的时候,aa这个对象已经构造出来了,此时只是将a赋值给aa,跟第一种情况用a来初始化aa有明显的不同。
总结:
在有对象生成的时候并用另一个同类对象初始化这个要生成的对象的时候调用拷贝构造函数,而在对象已经生成的情况下,则调用赋值运算符