class Demo
{
public:
Demo()
{
}
Demo(int j)
{
cout<<"Demo int: "<<j<<endl;
this->i = j;
}
Demo(const Demo& d)
{
cout<<"复制构造函数"<<endl;
}
Demo& operator = (const Demo& d)
{
cout<<"operator = 赋值构造函数"<<endl;
this->i = d.i;
return *this;
}
Demo& operator = (const int x)
{
this->i = x;
cout<<"operator = int: "<<x<<endl;
return *this;
}
int i;
};
int main(int argc, char * argv[])
{
@autoreleasepool {
/*
当我们使用一个对象来初始化另一个对象时,编译器将自动生成等效语句:Demo demo2 = Demo(demo1);即复制构造函
*/
Demo demo1;
Demo demo2 = demo1;
cout<<"*****"<<"demo2.i="<<demo2.i<<"*****"<<endl;
/*注意,如果我们把上面程序中的Demo demo2 = demo1分成两句来写, 则会发现调用了调用了 operator = (demo1),也就是demo2.operator = (demo1);*/
Demo demo3;
demo2 = demo3;
/*同样,这里等效于Demo demo2 = Demo(3),也就是带一个整型参数的构造函数,另外说明的是,如果要阻止这种隐式转换,可以在Demo(int j)构造方法前加上explicit关键字,这时候就只能显式调用Demo(3)才有效了。即写成:Demo demo2 = Demo(3);*/
Demo demo4 = 3;
cout<<"*****"<<"demo4.i="<<demo4.i<<"*****"<<endl;
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
输出结果:
复制构造函数
*****demo2.i=1437553448*****
operator = 赋值构造函数
Demo int: 3
*****demo4.i=3*****
复制构造函数
复制构造函数也是构造函数,但它只有一个参数,这个参数时本类的对象,而且采用对象的引用形式(一般约定加const声明,使参数值不能改变,以免在调用函数时因不慎而使对象值被修改)。此复制构造函数的作用就是将实参对象的各数据成员的值一一赋给新的对象中的成员的值。
对象的复制和赋值的区别
对象的赋值是对一个已经存在的对象赋值,因此必须先定义被赋值的对象,才能进行赋值。而对象的复制则是一个从无到有地建立一个新的对象,并使它与一个已有的对象完全相同(包括对象的结构和成员的值)