栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

拷贝构造函数与重载赋值运算符

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

拷贝构造函数与重载赋值运算符

C++的空类有哪些成员函数?

缺省构造函数。
缺省拷贝构造函数。
缺省析构函数。
缺省赋值运算符。
缺省取址运算符。
缺省取址运算符 const。

请问以下两份代码=符号的区别:

代码1:

Base b1;

Base b2;

b2 = b1;

和代码2:

Base b1;

Base b2 = b1;

代码1中,=表示赋值符号,而代码2中,表示拷贝构造,等价于Base b2(b1)

测试

代码3:

#include 
#include 
using namespace std;
class Base
{
public:
    Base()
    {
        m_nCount = 50;
         cout<<"Base()"<<"  this="<Base()  this=0x7ffeefbff3a8
Base::show m_nCount=50  this=0x7ffeefbff3a8

Base()  this=0x7ffeefbff378
operator=  this=0x7ffeefbff378
Base::show m_nCount=150  this=0x7ffeefbff378

结论:

所以,=符号,有时不一定就是赋值运算符号,也可以是拷贝构造函数;

如果将拷贝构造设置为private,将会禁止拷贝对象,同时禁止=,但是不能阻止赋值;

也就是代码1会报错,但是代码2仍然正常运行。

拷贝构造函数和赋值运算符重载有以下两个不同之处:
(1) 拷贝构造函数生成新的类对象,而赋值运算符不能。
(2) 由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉
注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认的。

引用:
https://blog.csdn.net/BostonRayAlen/article/details/93041395

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/982967.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号