Effective C++ 2.构造 析构 赋值运算
//条款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.构造 析构 赋值运算的更多相关文章
- 【Effective C++】构造/析构/赋值运算
条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函 ...
- 《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- 《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记
章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...
- EffectiveC++ 第2章 构造/析构/赋值运算
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 2 构造 / 析构 / 赋值 条款 05:了解C++ ...
- Effective C++ —— 构造/析构/赋值运算(二)
条款05 : 了解C++默默编写并调用哪些函数 编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 1. default构造函 ...
- Effective C++ 笔记二 构造/析构/赋值运算
条款05:了解C++默默编写并调用哪些函数 编译器默认声明一个default构造函数.一个copy构造函数.一个copy assignment操作符和一个析构函数.这些函数都是public且inlin ...
- Effective C++笔记:构造/析构/赋值运算
条款05:了解C++默默编写并调用哪些函数 默认构造函数.拷贝构造函数.拷贝赋值函数.析构函数构成了一个类的脊梁,只有良好的处理这些函数的定义才能保证类的设计良好性. 当我们没有人为的定义上面的几个函 ...
- Effective C++ -- 构造析构赋值运算
05.了解C++默默编写并调用哪些函数 编译产生的析构函数时non-virtual,除非这个类的基类析构函数为virtual 成员变量中有引用和const成员时,无法自己主动生成copy assign ...
- Effective C++笔记(二):构造/析构/赋值运算
参考:http://www.cnblogs.com/ronny/p/3740926.html 条款05:了解C++默默编写并调用哪些函数 如果自定义一个空类的话,会自动生成默认构造函数.拷贝构造函数. ...
随机推荐
- Visual Studio开发环境最佳字体及配色
环境: Visual Studio 2010,(本人使用的windows 7) 字体:Fixedsys, 12pt,下载地址:http://www.fixedsysexcelsior.com 普通文本 ...
- 从 github 执行 git clone 一个大的项目时提示 error: RPC failed
目前克隆一个比较大的项目,出现RPC failed的错误 Cloning into 'bigfiles'... remote: Counting objects: 190, done. remote: ...
- 页面静态化3 --- 使用PHP页面缓存机制来完成页面静态化(下)操作一个案例(新闻管理系统)
案例需求: 使用PHP缓存机制完成新闻管理系统的页面静态化数据库表 ecs_article (新闻表)因为新闻这些信息,并不是对实时性要求高,本身这个新闻比较稳定,内容也比较固定,所以我们考虑: 当第 ...
- visual studio 2005 编fortran程序,运行后dos窗口显示问题
比如程序: program main implicit none write(*,*) "AAAAAAAAAAAAAAAAAAAAAAAA" stop end 虽然可以看见DOS窗 ...
- JAVA 调用matlab 出错总结
1.Java:Unsupported major.minor version 51.0 (unable to load class 出现该错误是由于class编译器的JDK版本高于运行期的JDK版本. ...
- forms6 builder安装之后设置注册表开发环境
- fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
给对话框添加类, 报错 CalibrateMFCDlg.h(6) : error C2504: “CDialog”: 未定义基类 等多个错误 加上 #include "afxwin.h&qu ...
- JAVA缓存技术之EhCache
最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇,暂作保存,后面如果有用到可以参考.此为转贴,帖子来处:http://cogipard.info/ar ...
- windbg 命令 gchandles
使用windbg导出dump文件 .dump /ma D:\testdump.dmp gchandles命令列出句柄,同时列出句柄引用的对象,演示代码如下: using System; using S ...
- Qt 之 设置窗口边框的圆角(使用QSS和PaintEvent两种方法)
Qt在设置窗口边框圆角时有两种方式,一种是设置样式,另一种是在paintEvent事件中绘制窗口.下面分别叙述用这两种方式来实现窗口边框圆角的效果. 一.使用setStyleSheet方法 this- ...