//条款07:为多态基类声明virtual析构函数
// 1.若基类的析构函数不定义为虚函数,由于基类的指针或引用可以指向派生类的对象,则在删除基类对象的时候可能会出错,导致破坏数据结构。
// 2.如果一个类不含有虚析构函数,那么通常表示它并不希望其本身成为一个基类。
// 3.不要为普通的类声明一个虚析构函数。这是因为C++为了实现虚函数,会建立一个由函数指针构成的数组,称为虚函数表,导致类的对象必须携带额外信息来决定运行期间哪个虚函数会被调用,这个额外信息通常由一个指针组成,此指针指向虚函数表。
// 4.由3可知,当为类声明一个虚析构函数的时候,会使得类的对象占用更多的内存,在32位程序下,会多出4字节,在64位程序下会多出8字节.
class CTest
{
public:
virtual ~CTest(){}
public:
int value0;
int value1;
};
int size = sizeof CTest; //size = 16 64位程序,若去掉虚析构函数,则size = 8;
// 5.当一个类不包含虚析构函数的时候(比如string),不要在此类的基础上进行派生,否则在删除对象的时候可能会导致异常。原因见1。 //条款09:绝对不要在构造和析构过程中调用虚函数
// 1.如下代码,当构造CChild类的成员的时候,其父类的成员首先被构造,则先调用其父类的构造函数,其父类构造函数中调用了一个虚函数,此时并不会发生动态绑定,这里调用的虚函数是父类的版本。对象析构的时候也是如此。
class CFather
{
public:
CFather() {fun();}
virtual void fun(){printf("Father virtual ");}
};
class CChild : public CFather
{
public:
CChild() {fun();}
virtual void fun(){printf("Child virtual ");}
};
CChild child; //输出Father virtual Child virtual 而不是 Child virtual Child virtual //条款12:复制对象时勿忘其每一个成分
// 1.复制所有本类的成员变量,调用其基类的适当的拷贝函数
// 2.通常拷贝构造函数与拷贝赋值运算符所做的工作很接近,但是最好不要让其中一个调用另一个,应该定义一个新的函数,供这两个函数调用。
// 3.令拷贝赋值运算符调用拷贝构造函数是不合理的,因为这就像试图构造一个已经存在的对象,这是很荒谬的。
// 4.令拷贝构造函数调用拷贝赋值运算符也是不合理的,因为拷贝构造函数是用来初始化新对象,而拷贝赋值运算符只实施在已初始化的对象上,所以从逻辑上讲也是不合理的。   

  

Effective C++ 2.构造 析构 赋值运算的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Effective C++笔记(二):构造/析构/赋值运算

    参考:http://www.cnblogs.com/ronny/p/3740926.html 条款05:了解C++默默编写并调用哪些函数 如果自定义一个空类的话,会自动生成默认构造函数.拷贝构造函数. ...

随机推荐

  1. linux进程查找及杀死

    根据进程名称查找 ps aux|grep python(进程名) 杀死进程: kill -s 9 进程id

  2. Java中的可变参数以及foreach语句

    Java中的可变参数的定义格式如下: 返回值类型  方法名称(类型 ... 参数名称){} foreach语句的格式如下: for ( 数据类型  变量名称 :数据名称){ ... } public ...

  3. 关于C语言读取多行数据的问题

    我有如下数据格式3360  2001     5   1750.5   1246.5  22.5  n    1775=1177-1316:13360  2001     5   1750.5   1 ...

  4. nginx 反向代理 取得真实IP和域名

    nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递 ...

  5. 常见的Mule Esb下载地址

    http://www.myexception.cn/open-source/1832157.html

  6. 获取枚举Description 属性

    /// <summary> /// 获取枚举变量值的 Description 属性 /// </summary> /// <param name="obj&qu ...

  7. Mixing Delphi and C++(相互调用)

    Mixing Delphi and C++ You have a TStringList and <algorithm>. What can you do? Quite a lot, ac ...

  8. IE下载时提示无法下载,重试后成功

    // Add Excel as content type and attachment  Response.ContentType = “application/vnd.ms-excel”;  Res ...

  9. NuGet的几个小技巧

    因为是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因. 如有冒犯请联系本人,或删除,或标明出处. 因为好的文章,以前只想收藏,但连接有时候会失效,所以 ...

  10. GitLab使用方法

    注意只有master权限的用户才可以push到主线master分支上(默认受保护)(当一个新版本的app定版之后,才会提交到master分支上,平时不建议使用该分支),developer没有push到 ...