1 当用类的一个对象去初始化类的另一个对象时。
如下代码中的 Rectangle p2(p1), //用对象p1去初始化对象p2,拷贝构造函数被调用(代入法)
还有一种是赋值法 Rectangle p2=p1;
2 当函数的形参是类的对象,调用函数进行形参和实参的结合时。例如
void fun1(Rectangle p)//形参是类Rectangle的对象p
{
p.disp();
}
int main()
{
Rectangle p1(10,20);
fun1(p1);//调用函数fun1时,实参p1是类Rectangle的对象,将调用拷贝构造函数时,初始化形参对象p;
return 0;
}
在main()函数内,执行语句“fun(p1)”,便是这种情况,在调用这个函数时,对象p1是实参,用它来初始化被调用函数的形参p时,需要调用拷贝构造函数;
3 当函数的返回值是对象,函数执行完成返回调用者时,例如:
Rectangle fun2()
{
Rectangle p1(10,30);
return p1; //函数的返回值是对象
}
int main()
{
Rectangle p2;
p2=fun2(); //函数执行完成,返回调用者时,调用拷贝函数;
return 0;
}
在函数fun2()内, 执行语句“return p1”,将会调用拷贝构造函数将p1的值复制到一个无名对象中,这个无名对象是编译器系统在主程序中临时创建的。
函数运行结束时对象p1消失,但临时对象会存在于语句“p2=fun2()”中。执行完这条语句,临时无名对象的使命也就完成了,该临时对象便自动消失了;
//如果你的编译器对于第三种情况与该例不符合,请阅读我的文章
C++返回值为对象时复制构造函数不执行怎么办?
代码样例如下:
#include<iostream>
using namespace std;
class Rectangle
{
public:
Rectangle(int len=10,int wid=10);
Rectangle(const Rectangle &p);
void disp()
{
cout<<length<<" "<<width<<endl;
}
private:
int length;
int width;
};
Rectangle::Rectangle(int len,int wid)
{
length=len;
width=wid;
cout<<"using normal constructing..."<<endl;
}
Rectangle::Rectangle(const Rectangle &p)
{
length=2*p.length;
width=2*p.width;
cout<<"using copy constructing..."<<endl;
}
void fun1(Rectangle p)
{
p.disp();
}
Rectangle fun2()
{
Rectangle p4(10,30);
return p4;
}
int main()
{
Rectangle p1(30,40);
p1.disp();
Rectangle p2(p1);
p2.disp();
Rectangle p3=p1;
p3.disp();
fun1(p1);
p2=fun2();
p2.disp();
return 0;
}