Item 5: Know what functions C++ silently writes and calls

在C++中,编译器会自己主动生成一些你没有显式定义的函数,它们包含:构造函数、析构函数、复制构造函数、=运算符。
有时为了符合既有设计。我们不希望自己主动生成这些函数。我们能够把它们显式声明为private
此时在使用这些类的客户看来,它们就像不存在一样。

class Empty{
public:
// 默认构造函数
Empty(){}
// 拷贝构造函数
Empty(const Empty& rhs){}
// 析构函数
~Empty(){}
// 赋值运算符
Empty& operator=(const Empty& rhs){}
};

这些编译器自己主动生成的缺省方法是能够禁用的,把它们声明为private便能解决绝大多数问题。
很多其它的讨论能够參考:Item 6: 禁用那些不须要的缺省方法-Effective
C++笔记

调用时机

当我们没有显式地定义上述这四种函数时。编译器会自己主动帮我们定义。

这些函数它们调用的时机例如以下:

  1. 构造函数:对象定义;使用其它兼容的类型初始化对象时(可使用 explicit 来避免这样的情况)
  2. 复制构造函数:用一个对象来初始化还有一对象时。传入对象參数时。返回对象时。
  3. 析构函数:作用域结束(包含函数返回)时。delete
  4. =运算符:一个对象赋值给还有一对象

为了更清晰地说明它们的调用时机。来个样例吧:

Empty e1;               // 默认构造函数
Empty e2(e1); // 拷贝构造函数
Empty e3 = e1; // 拷贝构造函数
e2 = e1; // = 运算符 void func(Empty e){ // 拷贝构造函数。拷贝一份參数对象
return e; // 拷贝构造函数。拷贝一份返回对象
// 析构函数。拷贝得到的參数对象被析构
} e2 = func(e1); // = 运算符
// 析构函数。返回值被析构

引用成员

当对象包括引用成员时,拷贝和赋值行为将会变得很有趣,考虑这样一个类:

class Person{
public:
string & name;
Person(string& str): name(str){ }
};
string s1 = "alice", s2 = "bob";
Person p1(s1), p2(s2); s1 = s2;

赋值后,p1.name会指向p2.name吗?我们知道在C++中引用本身是不可改动的。

即使p1.name指向了p2.name。那么对p1.name的赋值将会影响到p2
于是。C++拒绝编译上述代码,此时我们须要手动定义一个赋值运算符。

说来奇妙。拷贝构造函数也存在相同的问题,编译器却从不抱怨。

能够正常编译,而且两个引用指向同一对象。


除非注明,本博客文章均为原创。转载请以链接形式标明本文地址: http://harttle.com/2015/07/23/effective-cpp-5.html

Item 5:那些被C++默默地声明和调用的函数 Effective C++笔记的更多相关文章

  1. 读书笔记 effective c++ Item 9 绝不要在构造函数或者析构函数中调用虚函数

    关于构造函数的一个违反直觉的行为 我会以重复标题开始:你不应该在构造或者析构的过程中调用虚函数,因为这些调用的结果会和你想的不一样.如果你同时是一个java或者c#程序员,那么请着重注意这个条款,因为 ...

  2. Effective C++(5) 了解C++默默地编写并调用哪些函数

    预热: 一个空的类,当编译器处理过之后,就包含: 一个copy构造函数 一个重载赋值操作符 一个析构函数 一个默认构造函数 Demo: class Empty() { }; // 声明一个空的类 cl ...

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

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

  4. item 5: 比起显式的类型声明,更偏爱auto

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 啊,简单愉快的代码: int x; 等等,讨厌!我忘了初始化x,所 ...

  5. Effective C++ 之 Item 6 : 若不想使用编译器自动生成的函数,就该明确拒绝

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

  6. 读书笔记 effective c++ Item 36 永远不要重新定义继承而来的非虚函数

    1. 为什么不要重新定义继承而来的非虚函数——实际论证 假设我告诉你一个类D public继承类B,在类B中定义了一个public成员函数mf.Mf的参数和返回类型并不重要,所以假设它们都是void. ...

  7. C#中声明、调用和配置事件的演示源码

    下面的内容是关于C#中声明.调用和配置事件的演示的内容,应该能对大伙有些好处. using System;namespace MyCollections { using System.Collecti ...

  8. Effective STL 笔记 -- Item 6 ~ 7: Container and Object Pointer

    Effective STL 笔记 – Item 6 ~ 7: Container and Object Pointer 中间两次笔记被删掉了,简单补一下: Item 3 中提到如果将对象直接放入容器中 ...

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

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

随机推荐

  1. bitbucket SSH 生成

    在bitbucket设置ssh的方法: 1.运行ssh-keygen. 2.一路enter,直接到结束. 3 seeting 中Bitbucket选择.ssh/id_rsa.pub文件

  2. NIO-4pipe

    import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.Pipe; import org.ju ...

  3. 深度扫盲JavaScript的模块化(AMD , CMD , CommonJs 和 ES6)

    原文地址 https://blog.csdn.net/haochangdi123/article/details/80408874 一.commonJS 1.内存情况 对于基本数据类型,属于复制.即会 ...

  4. LoadRunner去除事物中的程序的执行时间

    大家在性能测试过程中,经常会用到程序处理或组织数据,以达到一定的测试目的,但是程序本身执行会消耗一些时间,这部分消耗的时间是包含在响应时间里面,此时,响应时间=正常响应时间+程序执行消耗时间.那么如何 ...

  5. spectre漏洞代码分析-c代码

    下面一句话转自360: 现代处理器(CPU)的运作机制中存在两个用于加速执行的特性,推测执行( Speculative Execution)和间接分支预测(Indirect Branch Predic ...

  6. 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)I - 没有名字

    题目描述 tabris实在是太菜了,没打败恶龙,在绿岛也只捡到一块生铁回去了,为了不在继续拉低acimo星球的平均水平逃离地球,来到了Sabi星球. 在这里tabris发现了一种神奇的生物,这种生物不 ...

  7. Python并发编程-SocketServer多线程版

    #server.py import socket from threading import Thread def chat(conn): conn.send(b'hello') msg = conn ...

  8. hiho1393二分图多重匹配

    题目链接:[http://hihocoder.com/problemset/problem/1393] 题意:中文题意. 题解:二分图的多重匹配.主要是建图然后跑一个最带流,再判断一下就可以了. 建图 ...

  9. 【BZOJ 1398】 1398: Vijos1382寻找主人 Necklace (最小表示法)

    1398: Vijos1382寻找主人 Necklace Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 308  Solved: 129 Descrip ...

  10. Linux的十个最危险的命令

    Linux命令行佷有用.很高效,也很有趣,但有时候也很危险,尤其是在你不确定你自己在正在做什么时候. 这篇文章将会向你介绍十条命令,但你最好不要尝试着去使用. 当然,以下命令通常都是在root权限下才 ...