预热:

一个空的类,当编译器处理过之后,就包含:
  • 一个copy构造函数
  • 一个重载赋值操作符
  • 一个析构函数
  • 一个默认构造函数
Demo:

class Empty()  {   };       // 声明一个空的类

class Empty()     // 经过编译器处理后
{
public:
Empty() { ... }
Empty(const Empty& rhs) { ... }
~Empty() { ... } Empty& operator=(const Empty& rhs) { ... }
};

需要注意的一点是,只有当这些函数被需要时,它们才会被编译器创建出来。
现在我们知道了,编译器会为我们创建这些函数。
下面举个例子引入今天的重点问题:

如果编译器拒绝为我们做这些事情了,就麻烦了。那么,编译器什么情况下会拒绝为我们做这些事情呢?

Demo:

class Empty()  {   };       // 声明一个空的类

class Empty()     // 经过编译器处理后
{
public:
Empty() { ... }
Empty(const Empty& rhs) { ... }
~Empty() { ... } Empty& operator=(const Empty& rhs) { ... }
};
 

类NameObject并没有给我们重载赋值操作符,哪门这个编译器会给我提供这个操作吗,如果提供了这个操作,那么Demo中的p最后的成员的值是什么呢?让我们慢慢来分析一下:
1 p.nameValue
C++规定:不可以让reference改指向不同的对象。
因此,C++对这种情况是拒绝编译这一行的赋值动作。即如果你打算在一个有reference成员的class内支持重载赋值操作,那么你必须自己定义重载赋值操作符。
2 p.objectValue
对于const成员变量,更改const变量是不合法的,所以编译器同样拒绝为你创建这个赋值操作。
3 还有一个情况会导致编译器“罢工”
如果某个base classes将重载赋值操作符声明为private。
原因:子类中的重载赋值操作符会默认去调用基类中的赋值操作符。
小结:
编译器可以暗自为你创建默认构造函数、拷贝构造函数、重载赋值操作符,以及析构函数。
但是需要注意那些编译器拒绝你的情况。
参考:
《Effective C++ 3rd》

Effective C++(5) 了解C++默默地编写并调用哪些函数的更多相关文章

  1. Effective C++ 条款05:了解C++编写并调用哪些函数

    规则一 编译器默认操作 // 你认为 class Empty { }; // 实际上 class Empty { public: Empty() { ... } // default 构造函数 Emp ...

  2. Effective C++ 之 Item 5:了解C++默默编写并调用哪些函数

    Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 5 ...

  3. EC笔记,第二部分:5.了解C++默默编写并调用哪些函数

    5.了解C++默默编写并调用哪些函数 1.C++空类 C++会为一个空类建立以下函数 (1).默认构造函数 (2).默认拷贝构造函数 (3).析构函数 (4).赋值运算符(如果成员包含引用类型或con ...

  4. Effective C++ -----条款05:了解C++默默编写并调用哪些函数

    面对“内含reference成员或者含const成员”的class内支持赋值操作,你必须自己定义copy assignment操作符. 如果某个base classes将copy assignment ...

  5. [Effective C++ --005]了解C++默默编写并调用哪些函数

    <前言>编译器是个十分敬业的工作者,不但为你编译代码,甚至为你生成代码,不可思议吧.本文主要介绍编译器究竟会为我们生成和调用哪些代码. <空类和非空类>如果问什么样的类是空类? ...

  6. effective c++(05)(06)之c++默默编写并调用的函数

    1. 当只写一个空类的时候,编译器会为他声明一个copy构造函数,一个copy assignment函数和一个析构函数.如下: 如果写下: class Empty{ }; 编译器就会实现以下代码: c ...

  7. Effective C++ 条款五 了解C++默默编写并调用哪些函数

      //申明一个类时,编译器会默认为你提供四个函数. //无参构造函数,析构函数,copy构造函数,copy assignment操作符.     template <typename T> ...

  8. Effective C++条款05:了解C++默默编写并调用哪些函数

    class Empty{}; class Empty{ Empty(){}; Empty(const Empty& rhs){}; ~Empty(){}; Empty& operato ...

  9. 条款05:了解C++默默编写并调用哪些函数

    每一个class都会有一个或多个构造函数.一个析构函数.一个copy assignment操作符.这些控制着基础操作,像是产出新对象并确保它被初始化.摆脱旧对象并确保它被适当清理.以及赋予对象新值. ...

随机推荐

  1. javac的命令(-Xbootclasspath、-classpath与-sourcepath等)

    当编译源文件时,编译器常常需要识别出类型的有关信息.对于源文件中使用.扩展或实现的每个类或接口,编译器都需要其类型信息.这包括在源文件中没有明确提及.但通过继承提供信息的类和接口. 例如,当扩展 ja ...

  2. https证书pfx 生成 pem,crt,key

    (1)将.pfx格式的证书转换为.pem文件格式:    openssl pkcs12 -in xxx.pfx -nodes -out server.pem (2)从.pem文件中导出私钥server ...

  3. -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment avariable and mvn script match.

    eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is ...

  4. FocusBI:地产分析&雪花模型

    微信公众号:FocusBI关注可了解更多的商业智能.数据仓库.数据库开发.爬虫知识及沪深股市数据推送.问题或建议,请关注公众号发送消息留言;如果你觉得FocusBI对你有帮助,欢迎转发朋友圈或在文章末 ...

  5. Promise原理详解

    参考文章:深入理解 Promise.[翻译]Promises/A+规范 从入门Promise的正确姿势中我们已经了解到Promise的基本用法.那么现在给你一个需求:根据Promise的用法和Prom ...

  6. ListView和BaseAdapter

    参考资料:http://www.runoob.com/w3cnote/android-tutorial-listview.html <LinearLayout xmlns:android=&qu ...

  7. Golang之并发资源竞争(读写锁)

    前面的有篇文章在讲资源竞争的时候,提到了互斥锁.互斥锁的根本就是当一个goroutine访问的时候,其他goroutine都不能访问,这样肯定保证了资源的同步,避免了竞争,不过也降低了性能. 仔细剖析 ...

  8. [译]用R语言做挖掘数据《六》

    异常值检测 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到程序: ...

  9. openvpn应用场景案例【转】

    转载至:http://www.linuxfly.org/post/86/ 一.案例1 针对不同的客户端指定不同的等级和权限.通常的方法是:1.每个客户端分配不同的IP地址:2.利用防火墙对不同的IP地 ...

  10. 清空控件的TeXt属性

    foreach (Control item in groupBox1.Controls) { if (item is TextBox) //判断控件是不是TextBox { item.Text = & ...