C++自动提供了下面这些成员函数:

  • 默认构造函数,如果没有定义构造函数
  • 默认析构函数,如果没有定义
  • 复制构造函数,如果没有定义
  • 赋值运算符,如果没有定义
  • 地址运算符,如果没有定义

一、复制构造函数

复制构造函数用于将一个对象复制到新创建的对象中。

类的复制构造函数原型:_Class(const _Class &);

它接受一个指向类对象的常量引用作为参数。例如,StringBad类的复制构造函数的原型如下:

StringBad(const StringBad &);

何时调用复制构造函数?

StringBad ditto(motto); // 调用StringBad(const StringBad &)
StringBad metoo = motto; // 调用StringBad(const StringBad &)
StringBad also = StringBad(motto); // 调用StringBad(const StringBad &)
StringBad *pStringBad = new StringBad(motto); // 调用StringBad(const StringBad &)
如果重载了operator+(),则下面语句将调用复制构造函数:
StringBad x, y, z;
x + y = z; // x + y创建临时对象再被赋值z,创建临时对象时调用StringBad(const StringBad &)

每当程序生成了对象副本时,编译器都将使用复制构造函数。

在下述情况下,将使用复制构造函数:

  • 将新对象初始化为一个同类对象;
  • 按值将对象传递给函数;
  • 函数按值返回对象;
  • 编译器生成临时对象。

实现一个复制构造函数:

StringBad::StringBad(const StringBad & st) {num_strings++; // 处理静态成员的更新len = st.len;str = new char[len + 1]; // 分配空间std::strcpy(str, st.str); // 复制字符串到新地址cout << num_strings << ":\"" << str << "\" object created\n";
}

二、赋值运算符

并不是程序清单的所有问题都可以归咎于默认的复制构造函数,还需要看一看默认的赋值运算符。ANSI C允许结构赋值,而C++允许类对象赋值,这是通过自动为类重载赋值运算符实现的。这种运算符的原型:_Class & _Class::operator=(const _Class &);

它接受并返回一个指向类对象的引用。例如,StringBad类的赋值运算符的原型如下:

StringBad & StringBad::operator=(const StringBad &);

不要将赋值与初始化混淆了:

Star sirius;
Star alpha = sirius; // 初始化为一个对象
Star dogstar;
dogstar = sirius; // 赋值

如果语句创建新的对象,则使用初始化;如果语句修改已有对象的值,则是赋值。

何时调用赋值运算符?

将已有的对象赋给另一个对象时,将使用重载的赋值运算符:

StringBad headline1("Celery Stalks at Midnight");
...
StringBad knot; // 自动调用默认构造函数初始化knot
knot = headline1; // 赋值运算符被调用

初始化对象时,并不一定会使用赋值运算符:

StringBad metoo = knot; // 使用复制构造函数,也可能使用的是赋值运算符

与复制构造函数相似,赋值运算符的隐式实现也对成员进行逐个复制。对象赋值是通过默认赋值运算符函数实现的(如果没有重载),把对象A的数据成员的值逐位赋值给对象B,两个对象之间的赋值,仅仅使用这些对象中数据成员,而两个对象仍是分离的。如果成员本身就是类对象,则程序将使用为这个类定义的赋值运算符来复制该成员,但静态数据成员不受影响。

实现一个赋值运算符:

StringBad & StringBad::operator=(const StringBad & st) {if (this == &st)return *this;delete[] str;len = st.len;str = new char[len + 1];std::strcpy(str, st.str);return *this;
}

由于赋值运算符,是处理对象的复制,将对象的字段深度复制过来即可,不涉及创建新对象,所以实现代码里没有 num_strings++; 这样的代码。但对于自定义的复制构造函数而言,不管是临时对象,还是用另一对象初始化一个对象,都涉及创建新对象,所以有代码 num_strings++; 方便跟踪以及计数逻辑。

❥关于C++之类的复制构造函数赋值运算符相关推荐

  1. c++ 复制构造函数_C++学习刷题8--复制构造函数和赋值运算符重载函数

    一.前言 本部分为C++语言刷题系列中的第8节,主要讲解这几个知识点:复制构造函数和赋值运算符重载函数.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 知识点1:复制构造函数 1.当依据 ...

  2. 复制构造函数(拷贝构造函数)

    也许很多C++的初学者都知道什么是构造函数,但是对复制构造函数(copy constructor)却还很陌生.对于我来说,在写代码的时候能用得上复制构造函数的机会并不多,不过这并不说明复制构造函数没什 ...

  3. C++(18)--复制构造函数

    复制构造函数 <老九学堂C++课程><C++ primer>学习笔记.<老九学堂C++课程>详情请到B站搜索<老九零基础学编程C++入门> ------ ...

  4. 语言const的生命周期_如何理解一门编程语言2——以复制构造函数为例

    前些天我发布了一篇文章<如何理解一门编程语言>,文中我以C++中的const为例,给大家分享了如何通过修饰词的修饰对象来理解编程语言中晦涩难记的语法. 如果把 const 作为一个形容词来 ...

  5. C++中复制构造函数与重载赋值操作符

    我们都知道,在C++中建立一个类,这个类中肯定会包括构造函数.析构函数.复制构造函数和重载赋值操作:即使在你没有明确定义的情况下,编译器也会给你生成这样的四个函数.例如以下类:     class C ...

  6. C++ 复制构造函数或者拷贝构造函数

    复制构造函数 是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象. 复制构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象. 复制对象把它作为参数传 ...

  7. C++深复制(深拷贝)、浅复制(浅拷贝)和复制构造函数(拷贝构造函数)详解+实例

    转载出处:https://blog.csdn.net/sxhelijian/article/details/23209967 对象的复制 对于普通类型的对象来说,它们之间的复制是很简单的,例如: in ...

  8. 【C++】复制构造函数

    参考资料:黄邦勇帅(里面对于临时变量的说法我不是很理解,感觉里面的解释有问题) 用到复制构造函数的情况: 1.函数值传递 2.返回对象 3.用一个对象初始化另一个对象 重点注意下面两种情况: ① 只调 ...

  9. C++拷贝构造函数(复制构造函数)详解

    link 复制构造函数是构造函数的一种,也称拷贝构造函数,它只有一个参数,参数类型是本类的引用. 如果类的设计者不写复制构造函数,编译器就会自动生成复制构造函数.大多数情况下,其作用是实现从源对象到目 ...

最新文章

  1. 河南省第二届ACM程序设计大赛解题报告(置换群)
  2. 微信浏览器禁止页面下拉查看网址
  3. python序列类型唯一的映射类型_python2.x学习笔记(8)-映射和集合类型
  4. 日期时间选择器-jeDate日期控件
  5. JavaFX 架构与框架 (译)
  6. Google Protobuf
  7. Windows的同步I/O和异步I/O
  8. ThinkPad T14 Gen3拆机更换升级内存和固态硬盘
  9. 嵌入式Linux书籍清单
  10. 目前最火的PostgreSQL数据库,我通关了 | PostgreSQL技能树测评
  11. @Transactional注解解析
  12. leetcode-739:每日温度
  13. 12款精品网盘资源搜索网站,只有你想不到没有它搜不到的
  14. Arcgis使用教程(六)ARCGIS空间数据查询
  15. android按键静音键功能实现
  16. AWS KVS(Kinesis Video Streams)之WebRTC的C库
  17. 嵌入式C语言自我修养:从芯片、编译器到操作系统-习题、笔记
  18. [siggraph2011]Secrets of CryENGINE 3 Graphics Technology
  19. mysql 分组统计 每天_MySQL按时间分组统计每天的数量
  20. 每个初恋女子都是相似的

热门文章

  1. 长春财经学院计算机专业多少分录取,长春财经学院2020录取分数线(附2017-2020年分数线)...
  2. 什么是激光切割和线切割?它们有什么区别?
  3. 线性代数笔记2.6初等变换
  4. 频繁项集挖掘算法在告警关联中的应用
  5. 作为前端的你不能不知道的知识,总结物理像素,像素密度,分辨率,CSS像素,设备像素比,二倍图,layout viewport、visual viewport 、ideal viewport、meta。
  6. ImportNew 笔记
  7. Python 统计Excel表格中的各省人口数量 表格→集合
  8. html5清除圆形区域,html5 canvas拓展clearRect()实现圆形区域清理
  9. 出身农村的大学生开发者,只想让乡亲们回家!
  10. 浏览器工作原理--分析