主要讲了

1. 一般情况下编译器会为类创建默认的构造函数,拷贝构造函数和copy assignment函数

2. 执行默认的拷贝构造/copy assignment函数时,如果成员有自己的拷贝构造/copy assignment函数就执行它,否则就按bit拷贝/赋值

3. 几种编译器不会为类生成默认的copy assigment操作的情况

这几种情况如下:

a. 类里面已经有了相应的的构造函数,拷贝构造函数,copy assignment函数。此时再生成默认的这些函数就失去其原来的意义了。

b. 其他情况是由于2中的一些步骤不能执行或者如果执行而违反了C++的一些设计规范

b.1 一些成员(或父类)的copy asignment函数是私有的,导致拷贝步骤无法执行,默认函数也就不生成了

class Age {
public:
Age(int _age) : age(_age) {}
private:
int age; Age& operator=(const Age& rhs) {
if (&rhs != this) {
this->age = rhs.age;
}
return *this;
}
}; class Man {
private:
Age age;
public:
Man(int _age): age(_age) {}
}; Man man1();
Man man2();
man1 = man2;

编译器提示:

[Note] 'Man& Man::operator=(const Man&)' is implicitly deleted because the default definition would be ill-formed:

[Error] 'Age& Age::operator=(const Age&)' is private

b.2 类中成员有些是const的或者是引用类型,我们知道,const变量在赋值后不能再被assignment,而引用类型变量也是如此(指向的对象不能被改变)

#include <iostream>
#include <cstdlib>
#include <string> using namespace std; class NamedObject {
public:
string& name;
int& age;
NamedObject(string& _name, int& _age):name(_name), age(_age) {}
}; int main() {
string n1("obj1");
int a1 = ; string n2("obj2");
int a2 = ; NamedObject obj1(n1, a1); NamedObject obj2(n2, a2); obj1 = obj2; return ;
}

obj1 = obj2,就相当于对const变量重新赋值和更改引用指向对象,显然这是不能被支持的,所以编译器不能创建默认行为的copy assignment函数,而必须由自己进行处理。

最新文章

  1. Shell特殊变量
  2. dyld: Library not loaded...
  3. WinAPI: ShellExecute - 打开外部程序或文件
  4. (七)STM32的RTC简单操作
  5. C++学习25 纯虚函数和抽象类
  6. d3可视化实战02:理解d3数据驱动的真正含义
  7. asp之FSO大全
  8. 自己动手编写IOC框架(四)
  9. 邓_phpcms_二次开发_创建插件
  10. InsertSort
  11. echarts地图 禁止高亮显示(转载)
  12. com.alibaba的fastjson简介
  13. 软工网络15Alpha阶段敏捷冲刺博客集合
  14. 学习angularjs的ng-hide和ng-disabled
  15. IAR ------ 基本使用
  16. poj2056
  17. #define WIN32_LEAN_AND_MEAN 的作用
  18. Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2016-07-20 16:27:34.873, end time: 2016-07-20 16:27:39.895, client elapsed: 0 ms
  19. cydia源
  20. 【C#日期系列(二)】--C#获取一段时间有多少个星期几

热门文章

  1. 如何实现 Python 中 selnium 模块的换行
  2. c++和java在桌面应用软件开发的区别
  3. 使用Pytesseract+Tesseract-OCR识别图片的简单步骤
  4. Windows/Ubuntu下,将所有文件名字列举出来并保存到txt文件中
  5. list排序问题
  6. python学习,day3:函数式编程,带return
  7. Effective C++ 改善55个方法
  8. x86/x64/AnyCPU之间的区别
  9. 基于web端去除空格小工具
  10. MySQL数据表的修改