探究C++中的对象赋值与拷贝

本文探讨了C++中的对象赋值与拷贝,包括赋值运算符、复制构造器、浅拷贝与深拷贝的概念。强调了在处理包含指针成员的对象时,需要自定义赋值运算符和复制构造器以实现深拷贝,以避免数据共享和内存问题。并通过示例解析了程序中常见的拷贝场景,如按值传递和返回对象。
摘要由CSDN通过智能技术生成


由C++的 复制构造器=运算符重载入手,总结默认的 成员赋值(浅拷贝)深拷贝,最后探究程序中常见的对象赋值和拷贝。如有指正或补充,请不吝指出。

还是以一个例子辅以说明,这里使用一个自定义带编号字符串类MyString,每一个字符串对象都由其编号和字符串内容唯一确定。

1、赋值运算符与复制构造器

定义MyString类后,看如下语句:

MyString str1("C++");  //使用构造器
//先声明,再赋值
MyString str2;
str2=str1;
//声明并初始化
MyString str3=str1;

上面str2str3的两种赋值方式是否有区别?首先,从结果来看,它们是等效的,都是创建了一个字符串,并把str赋给它。但二者实现过程却具有本质的不同。前者是先使用无参构造器创建对象,再通过赋值运算把str1赋给该对象;后者是直接从复制构造器创建一个对象。因此,C++中的"初始化"特指声明的同时赋值。

1.1、赋值运算符

编译器会在类没有重载=运算符的时候提供默认的赋值运算操作,默认赋值只进行简单的成员赋值。如,在MyString中,类这样:

/*MyString对象具有属性成员: id,len,str(char*)*/
MyString& MyString::operator=(const MyString& s){
    id=s.id;
    len=s.len;
    str=s.str;    //直接把指针赋值
}

所以,即使没有重载=,类对象也能进行赋值,但这种赋值不一定安全。

1.2、复制构造器

复制构造器(copy constructor)是编译器默认为类添加的构造器。是的,编译器除了在没有构造器的时候提供默认无参构造器,还会在你没有提供复制构

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值