C++,对象的 =赋值 以及 复制构造函数赋值

 

1. C++默认实现了 = 号赋值;operator=只要将一个对象的内容的内容逐位复制给另外一个对象即可。

2. C++默认实现了复制构造函数;同样,只要将一个对象的内容的内容逐位复制给另外一个对象即可。

3. 默认实现的复制构造函数属于浅拷贝。当对象里面有指针的时候,第二个对象的指针并没有重新分配空间,这时如果析构函数delete了这个指针,会造成重复delete。

这个时候,要自己实现复制构造函数,在构造函数中new重新分配空间,并可用memcpy手动复制该空间的值。

4. = 号操作符也可以自己实现;

 

使用默认的 = 操作符以及默认的复制构造函数的例子:

#include <iostream>
using namespace std;

class Demo
{
public:
    int x ;
    int y ; 
};

int main()
{
    Demo demo1;
    demo1.x = 11;
    demo1.y = 111;

    Demo demo2;
    demo2 = demo1;//默认的等号赋值,属于浅拷贝。但对象成员没有指针变量时,无需顾虑。
    cout<<"demo2-----"<<demo2.x<<endl;
    cout<<"demo2-----"<<demo2.y<<endl;

    Demo demo3(demo1);//默认的复制构造函数,属于浅拷贝。可以自己实现,Demo::Demo(Demo& val);
    cout<<"demo3-----"<<demo3.x<<endl;
    cout<<"demo3-----"<<demo3.y<<endl;

    while(1);
    return 0 ;
}

/**结果:

demo2 x-----11
demo2 y-----111
demo3 x-----11
demo3 y-----111

*/

 

下面是自己实现复制构造函数的例子:

#include <iostream>
using namespace std;

class Demo
{
public:
    int x ;
    int y ; 
    Demo();
    Demo(Demo& val);
};

Demo::Demo()
{

}
Demo::Demo(Demo& val) //自己实现拷贝构造函数 
{
    this->x = val.x +1;//故意+1以示区分
    this->y = val.y +1;
}

int main()
{
    Demo demo1;
    demo1.x = 11;
    demo1.y = 111;

    Demo demo2;
    demo2 = demo1;//等号赋值,属于浅拷贝
    cout<<"demo2 x-----"<<demo2.x<<endl;
    cout<<"demo2 y-----"<<demo2.y<<endl;

    Demo demo3(demo1);//
    cout<<"demo3 x-----"<<demo3.x<<endl;
    cout<<"demo3 y-----"<<demo3.y<<endl;

    while(1);
    return 0 ;
}
/*测试结果:
demo2 x-----11
demo2 y-----111
demo3 x-----12
demo3 y-----112
*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值