参考:http://www.cnblogs.com/ronny/p/3740926.html

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

如果自定义一个空类的话,会自动生成默认构造函数、拷贝构造函数、拷贝赋值函数、析构函数(再次感觉原文翻译的实在是太啰嗦了!)。

当成员变量里有const对象或引用类型时,编译器会不能合成默认的拷贝赋值函数;当一个基类把它的拷贝赋值函数定义为private时,它的派生类

也不能生成默认的拷贝赋值函数,因为它无法完成基类成份的赋值。

条款06:若不想使用编译器自动生成的函数,就该明确拒绝

如果不想编译器自动生成默认函数,可将相应的成员函数声明为private并且不实现(否则成员函数或友元仍能调用);也可以在基类中实现并私有继承

C++11中已经摒弃了上述的做法,而是通过删除函数来设定,只需要在对应的函数列表后加=delete即可。

条款07:为多态基类声明virtual析构函数

当你需要手动的去delete一个指向基类的指针的时候,需要将该基类的析构函数设置为virtual,这样可以让delete时,动态的删除可能的派生类的成员。

不要无端的给一个没有virtual成员函数的类的析构函数声明为virtual,因为如果要实现virtual函数必须让类携带更多的信息(存储空间)。

标准的string不含任何virtual函数,所以不要把string定义为某个定义类的基类。类似的情况也发生成STL的其他容器如vector,list,set等上。

为一个抽像基类(不能定义对象实体)声明一个纯虚函数,而且要为这个纯虚函数要提供一份定义。即如果一个类带有任何一个虚拟函数,则它需要定义

一个虚拟析构函数。

并不是多所有基类设计都是为了多态(经base class接口处理derived class对象)用途,因此它们不需要虚拟析构函数。即如果一个类不是基类或不是作为

多态来使用,就不该声明虚拟析构函数。

条款08:别让异常逃离析构函数

不要让析构函数吐出异常。如果一个被析构函数调用的函数可能抛出获异常,析构函数应该捕捉任何获异常,然后吞下它们(不传播)或结束程序。

如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非析构函数中)执行该操作。

条款09:绝不在构造和析构过程中调用virtual函数

在构造和析构函数中不要调用virtual函数,因为这类调用从不下降至派生类。

条款10:令operator=返回一个reference* this

x=y=z=15实际上是采用右赋值的,这个连锁赋值可以解析为:x=(y=(z=15))。这里15先被赋值给z,然后其结果(更新后的z)再被赋值给y,然后其结果(更新后的y)再被赋值给x。

所以如果我们想保证y和z在完成赋值后能够对自己更新,则需要operator=返回一个本身的引用。

条款11:在operator=中处理"自我赋值"

对对像赋值时,有时有可能发生自我赋值,这就要求我们赋值时比较来源对象和目标对象的地址或使用先赋值再删除的语句顺序。

条款12:复制对象时勿忘其每一个成分

当你编写一个拷贝构造函数或拷贝赋值运算符时,请确保有的局部成员变量都被拷贝以及调用所有的基类的适当的拷贝函数。

虽然拷贝赋值操作符与拷贝构造函数做了类似的事情,但是你不能在拷贝赋值操作里调用拷贝构造函数,因为你试图对一个已经定义的对象从重定义并初始化。

如果你发现你的copy构造函数和copy assignment操作符有相近的代码,消除重复代码的做法是,建立一个新的成员函数来给两者调用。

Effective C++笔记(二):构造/析构/赋值运算的更多相关文章

  1. Effective C++ 笔记二 构造/析构/赋值运算

    条款05:了解C++默默编写并调用哪些函数 编译器默认声明一个default构造函数.一个copy构造函数.一个copy assignment操作符和一个析构函数.这些函数都是public且inlin ...

  2. Effective C++笔记:构造/析构/赋值运算

    条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函 ...

  3. EC++学习笔记(二) 构造/析构/赋值

    条款05:了解c++默默编写并调用了哪些函数 编译器可以暗自为 class 创建default构造函数,copy构造函数,copy assignment操作和析构函数所有这些函数都是 public 并 ...

  4. 《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  5. 《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  6. EffectiveC++ 第2章 构造/析构/赋值运算

    我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 2 构造 / 析构 / 赋值 条款 05:了解C++ ...

  7. Effective C++ —— 构造/析构/赋值运算(二)

    条款05 : 了解C++默默编写并调用哪些函数 编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 1. default构造函 ...

  8. Effective C++ -- 构造析构赋值运算

    05.了解C++默默编写并调用哪些函数 编译产生的析构函数时non-virtual,除非这个类的基类析构函数为virtual 成员变量中有引用和const成员时,无法自己主动生成copy assign ...

  9. 【Effective C++】构造/析构/赋值运算

    条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函 ...

随机推荐

  1. 【刷题】LOJ 6038 「雅礼集训 2017 Day5」远行

    题目描述 Miranda 生活的城市有 \(N\) 个小镇,一开始小镇间没有任何道路连接.随着经济发现,小镇之间陆续建起了一些双向的道路但是由于经济不太发达,在建设过程中,会保证对于任意两个小镇,最多 ...

  2. CF335F Buy One, Get One Free 贪心

    题意: \(n\)个物品,每个物品有一个价格,买一个高价格的物品,可以选择免费得到一个价格严格低于这个物品的物品.求得到\(n\)个物品的最小代价. 题解: 神仙贪心-- 题目要求求出最小代价,相当于 ...

  3. 洛谷 P4319 变化的道路 解题报告

    P4319 变化的道路 题目描述 小 w 和小 c 在 H 国,近年来,随着 H 国的发展,H 国的道路也在不断变化着 根据 H 国的道路法,H 国道路都有一个值 \(w\),表示如果小 w 和小 c ...

  4. ping: unknown host 解决办法

    如果ping命令返回如下错误,那主要的可能性就是系统的DNS设置有误. [root@CentOS5 ~]# ping www.sina.com.cn ping: unknown host www.si ...

  5. C之面向对象编程20170707

    语言只是工具,设计思维才是根本.C虽然是面向过程的语言,但也是可以实现面向对象编程的,本文就是介绍如何使用C语言实现面向对象编程. 我们知道面向对象主要有三大特性:封装,继承,和多态,下面就从这个三个 ...

  6. 「Python」10个python项目

    1. Pillow. Pillow是由Alex Clark以及其他贡献者实现的“友好版”的PIL.PIL即Python Imaging Library,作者是Fredrik Lundh及其他开发者.A ...

  7. Tensorflow实现学习率衰减

    Tensorflow实现学习率衰减 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Deeplearning AI Andrew Ng Tensorflow1.2 API 学习率衰减 ...

  8. JS函数大全 莫名其妙找到的

    1 .document.write(""); 输出语句 2 .JS中的注释为// 3 .传统的HTML文档顺序是:document->html->(head,body) ...

  9. 分治思想 特别常用 Codeforces Beta Round #80 (Div. 1 Only) D

    D. Time to Raid Cowavans time limit per test 4 seconds memory limit per test 70 megabytes input stan ...

  10. Atcoder arc077 D - 11 组合

    Link 题意:给出n个数,其中有一个数会出现两次,其余数只出现一次,问不同长度且不同的子串的数量.取模1e9+7 思路:组合求出所有情况,减去重复情况,注意用逆元即可 /** @Date : 201 ...