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++默默编写并调用哪些函数 如果自定义一个空类的话,会自动生成默认构造函数.拷贝构造函数. ...
随机推荐
- Nginx_Lua
http://www.ttlsa.com/nginx/nginx-lua/ 1.1. 介绍ngx_lua – 把lua语言嵌入nginx中,使其支持lua来快速开发基于nginx下的业务逻辑该模块不在 ...
- Java单链表的实现
将结点Node进行封装,假设Node的操作有增加,删除,查找,打印几个操作.将Node实现为链表Link的内部类,简化代码. package Chapter5; import java.securit ...
- Flink - FlinkKafkaConsumer08
先看 AbstractFetcher 这个可以理解就是,consumer中具体去kafka读数据的线程,一个fetcher可以同时读多个partitions的数据来看看 /** * Base cl ...
- HTML5 测验记录
结果:11/20 您的回答: 1.HTML5 之前的 HTML 版本是? 您的回答:HTML 4 正确答案:HTML 4.01 2.HTML5 的正确 doctype 是? 您的回答:<!DOC ...
- [daily][optimize] 一个小python程序的性能优化 (python类型转换函数引申的性能优化)
前天,20161012,到望京面试.第四个职位,终于进了二面.好么,结果人力安排完了面试时间竟然没有通知我,也没有收到短信邀请.如果没有短信邀请门口的保安大哥是不让我进去大厦的.然后,我在11号接到了 ...
- docker kubernetes--
http://kubernetes.io/docs/getting-started-guides/docker/ https://hub.docker.com/r/solsson/hyperkube- ...
- c 生成随机不重复的整数序列
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <time.h> ...
- django internal search
最近改进了项目中的站内搜索的功能,增加了全文索引,提升了搜索速度.因为项目框架是django,所以采用django+haystack+pyelasticsearch+elasticsearch的方式实 ...
- (读书笔记)Asp.net Mvc 与WebForm 混合开发
根据项目实际需求,有时候会想在项目中实现Asp.net Mvc与Webform 混合开发,比如前台框架用MVC,后台框架用WebForm.其实要是实现也很简单,如下: (1)在MVC 中使用Webfo ...
- JavaScript实现dropdownlist选定值后将选定值的key与value填入两个textbox中
<script language="javascript" type="text/javascript"> var txtText0 = " ...