C++拷贝构造函数被调用的场景
考虑如下的类
class A{
public:
// 无参构造函数
A(){}
//传入一个字符串代表变量的名字
A(string n) : name(n){ cout << name << " 构造函数 " << __FUNCTION__ << endl;}
~A(){cout << name << " 析构函数 " << __FUNCTION__ << endl;}
//拷贝构造函数
A(const A& a)
{
this->name = a.name;
cout << name << " 拷贝构造函数 " << __FUNCTION__ << endl;
}
//重载=运算符
A& operator=(const A& a)
{
cout << name << " 复制构造函数 " << __FUNCTION__ << endl;
if(this == &a) return *this;
this->name = a.name;
return *this;
}
friend ostream& operator<<(ostream& os, const A& a);
private:
string name;
};
ostream& operator<<(ostream& os, const A& a)
{
os << "类的名字: " << a.name << endl;
return os;
}
场景1
int main(void)
{
A a1("a1");
A a2 = a1; //调用拷贝构造函数
A a3;
a3 = a1;//不会调用拷贝构造函数,因为这是赋值,并不是初始化。
}
场景2
int main(void)
{
A a4(a1); //会调用A的拷贝构造函数
}
场景3
void f(A a)
{
cout << a << endl;
}
int main(void)
{
f(a1) //将会调用A的拷贝构造函数
}
因为以值传递的方式会调用拷贝构造函数,所以在拷贝构造函数中对拷贝构造的定义中是以引用的方式进行参数传递的,为了防止在拷贝构造函数参数传递的过程中再次调用拷贝构造函数,形成递归。
在看其他人的博客的时候,看到了函数返回的时候也会调用拷贝构造函数,但是在我这个机器上并没有测试出来。
A f(void)
{
A a("函数返回值");
cout << a << endl;
return a;
}
int main(void)
{
A a9 = f();//没有调用A的拷贝构造函数
A a8;
a8 = f(); //调用了operator= 函数
}