预热:

一个空的类,当编译器处理过之后,就包含:
  • 一个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. 【树】Validate Binary Search Tree

    需要注意的是,左子树的所有节点都要比根节点小,而非只是其左孩子比其小,右子树同样.这是很容易出错的一点是,很多人往往只考虑了每个根节点比其左孩子大比其右孩子小.如下面非二分查找树,如果只比较节点和其左 ...

  2. maven备忘

    maven常见命令 mvn clean mvn compile mvn package mvn clean compile package mvn -Djetty.port= jetty:run mv ...

  3. 使用Jprofiler+jmeter进行JVM性能调优

    一.JProfiler简介 JProfiler 是一个商业授权的Java剖析工具,由EJ技术有限公司,针对的Java EE和Java SE应用程序开发的.它把CPU.执行绪和内存的剖析组合在一个强大的 ...

  4. 一些Android的博客,没事翻翻

    深入剖析Android系统(推荐) 深入浅出Android系统移植与平台开发系列(推荐) Android系统开篇(小米工程师对系统的整体分析,推荐) Android6.0Framework源码解析系列 ...

  5. window常用的快捷键

    1.win+r打开运行命令 2.appwiz.cpl打开程序面板,进行程序的安装.卸载 输入win+r打开运行命令,输入appwiz.cpl 3.services.msc打开服务,一般用于启动或者关闭 ...

  6. github提交代码不用输入账号密码的解决方案

    1.在命令行输入命令: git config --global credential.helper store 这一步会在用户目录下的.gitconfig文件最后添加: [credential] he ...

  7. 如鹏网学习笔记(五)MySql基础

    MySQL基础 一.数据库概念 1,网友装备信息.论坛帖子信息.QQ好友关系信息.学籍管理系统中的学生信息等都要“持久化”的保存到一个地方, 如果通过IO写到文件中,那么会非常麻烦,而且不利于多人共享 ...

  8. BigDecimal 类的使用

    BigDecimal 类的使用 1.使用 BigDecimal 的原因   由于需要计算金额,所有需要高精度计算,所有需要使用 BigDecimal 类. BigDecimal能够精确的表示一个小数, ...

  9. Java处理emoji

    1.问题产生情况 我遇到这个问题是做微信开发的时候有些有用的头像用了微信的emoji表情,然而我的mysql数据库用的编码是utf8_general_ci,就是utf-8编码,结果也就报错误了. 2. ...

  10. Java关闭钩子的应用 - Shutdown Hook

    背景 在开发中,遇到这种情况,多个线程同时工作,突然一个线程遇到了fetal的错误,需要立即终止程序,等人工排查解决了问题之后重新启动.但是这样会有一个问题,程序终止时,其他线程可能正在进行重要操作, ...