《More Effective C++》
new operator申请内存,并调用构造函数;
而operator new只申请内存;
new operator会调用operator new来申请内存;operator new可以重写或重载;
placement new
exception specifications
void f1(); //该函数可能掷出任何类型的exception
void f2() throw(int);//该函数只掷出型别为int的exception
void f3() throw();//该函数不掷出任何exception
条款19:了解临时对象的来源
一是函数调用时参数的隐式类型转换;(如果参数类型是reference-to-non-const 时,不会进行隐式类型转换,因为这类函数会对实参进行修改)
二是当函数返回对象时。
C++真正所谓的临时对象是不可见的——只要产生一个 non-heap object 而没有为它命名,就产生了一个临时对象。它一般产生于两个地方:一是函数参数的隐式类型转换,二是函数返回对象时。 任何时候,只要你看到一个 reference-to-const 参数,就极可能会有一个临时对象被产生出来绑定至该参数上;任何时候,只要你看到函数返回一个对象,就会产生临时对象(并于稍后销毁)。
虚函数表vtbl(通常是“函数指针”数组,某些编译器可能以“函数指针”链表),一个类一份;
虚函数指针vptr,每个对象一个,和该对象的数据成员一起组成该对象,虚函数指针指向对象所属类的虚函数表。
看这个调用:pC1->f1();
如果函数f1的虚函数表vtbl索引是i,则这个调用产生的代码将是:
(*pC1->vptr[i])(pC1);//调用pC1->vptr所指之vtbl的第i个元素所指函数。
特别注意,(*pC1->vptr[i])(pC1),此处pC1被传给该函数作为this指针之用。结合下面的static成员函数加深对this指针的理解:
static成员函数
static成员是类的组成部分并不是任何对象的组成部分,因此,static成员函数没有this指针。我们知道,一般而言,类中的成员函数具有一个附加的隐含实参,即指向该类对象的一个指针。这个隐含实参命名为this。作用(只是参考别人的回答):1, 类似于namespace, 可以防止名字冲突。2, 可以有访问权限控制. 比如非public的static成员仅能在本类/子类的内部访问。
25、将 constructor 和 non-member functions 虚化
具体参见收藏的读书笔记。
static数据成员不能在类的定义区初始化,因此通常在某个实现文件中对它进行初始化;但新加入的C++特性允许对static const成员(必须为整形变量)进行初始化。
在派生类中使用using声明,使基类的成员可见,可以改变派生类对基类成员的访问权限。
隐式类型转换形式:operator T*();
单一自变量构造函数也可以作为类型转换操作符使用:T1(const T2* t2);
这两个都可能在函数调用时进行参数类型转换,但不能需要两次转换。
在智能指针中,由于其实现其实是模板类,因此基类和派生类、普通类型和该类型的const类型的智能指针是完全不同的类型,因此如果需要这些类型的智能指针间的隐式转换,需要自己实现相应的转换函数。
33、将非尾端类设计为抽象类
只要不是最根本的实体类(不需要进一步被继承的类),都设计成抽象类。
一般做法是将析构函数设计成纯虚函数,注意该纯虚析构函数必须被实现出来。
如果有两个具象类,其中一个要继承另一个,最好设计成一个抽象类,然后两个具象类都继承该类。
34、如何在同一个程序中结合 C++ 和 C
在确保你的C++和C编译器产生兼容的目标文件后,还有四件事需要考虑:
1、名称重整Name Mangling:(C++中,编译器可以将函数名重整,其在底层目标文件中使用了另一个名称);
2、statics(包括static类对象、全局对象、namespace内对象、文件范围内的对象)的初始化:通常要求这些statics要在main之前构造,在main函数之后析构,而main是程序起点,编译器的一个做法是main函数开始处执行构造,在末尾执行析构;
3、动态内存分配:new、delete对应,malloc、free对应;
4、数据结构的兼容性:
《More Effective C++》的更多相关文章
- 《More Effective C#》读书笔记
<More Effective C#>这本书,大概是四年前看完的,但只整理了一部分读书笔记,后面有时间的话,会陆续补充的. More Effective C# :使用泛型 More Eff ...
- C++学习书籍推荐《More Effective C++》下载
百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...
- ###《More Effective C++》- 基础议题
More Effective C++ #@author: gr #@date: 2015-05-11 #@email: forgerui@gmail.com 一.仔细区别pointers和refere ...
- ###《More Effective C++》- 操作符
More Effective C++ #@author: gr #@date: 2015-05-21 #@email: forgerui@gmail.com 五.对定制的"类型转换函数&qu ...
- ###《More Effective C++》- 异常
More Effective C++ #@author: gr #@date: 2015-05-24 #@email: forgerui@gmail.com 九.利用destructors避免泄漏资源 ...
- 《More Effective C++》读书笔记(零)Basic 基础条款
这是篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点.我推荐学C++的人都好好读一遍Effective C++ 系列,真是 ...
- 《More Effective C++ 》读书笔记(二)Exception 异常
这事篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点.我推荐学C++的人都好好读一遍Effective C++ 系列,真是 ...
- 《MORE EFFECTIVE C++》条款20 条款21
条款20 协助编译器实现返回值优化 当重载运算符的时候,比如+ - * / 这类运算符,该函数返回的值一定是个右值(即不能是引用),那么执行一次运算的开销可能会在临时对象上调用多次构造函数和析构函数, ...
- 《more effective C++》条款10 防止构造函数里的资源泄露
构造函数也可能发生内存泄露,考虑如下程序: class A { public: A(int *p) { if(p!=NULL) num=p; ); //do something } private: ...
随机推荐
- myeclipse WIN7下设置字体列表中无Courier New
到"C:\Windows\Fonts"下找到对应的字体,单击,选择上面的显示 然后就可以在eclicpse字体设置里面看到Courier New项了: Eclipse字体设置方法: ...
- iOS - (利用/调用系统定位获取当前经纬度与地理信息)
这些天做iOS项目的时候,需要通过定位来拿到当期城市的名称.百度地图SDK有这个功能,但为了不依赖第三方,这里使用iOS自带框架CoreLocation来实现这个需求.iOS8出来之后,针对定位需要多 ...
- Azure Remote Desktop: "An error occurred while loading from file *.rdp"
Tonight I deployed a new cloud service where I needed remote desktop to check on some things. After ...
- maven 一好用的仓库镜像
<mirror> <id>ibiblio.org</id> <name>ibiblio Mirror of http://repo1.maven.org ...
- C++Primer 第十九章
//1.控制内存分配: //A:某些应用程序对内存分配有特殊的需求,因此我们无法将标准内存管理机制直接应用于这些程序.它们常常需要自定义内存分配的细节,比如使用关键字new将对象放置在特定的内存空间中 ...
- From Disk partition to PostgreSQL installation
From Disk partition to PostgreSQLinstallation [root@compute mnt]# fdisk /dev/sdb Welcome to fdisk (u ...
- SQL 启动服务方法
(1)windows开始菜单->Microsoft SQL Server 2012->配置工具->配置管理器
- NovaMind使用教程
NovaMind 使用教程 目前NovaMind在网络上基本没什么中文资料,它自带的"欢迎"导图也只有英文版本.导致很多朋友对这个工具的使用技巧不够了解.今天我把自己的使用心得整理 ...
- Java基础(54):java四种内部类详解(转)
一般来说,有4中内部类:常规内部类.静态内部类.局部内部类.匿名内部类. 一.常规内部类:常规内部类没有用static修饰且定义在在外部类类体中. 1.常规内部类中的方法可以直接使用外部类的实例变量 ...
- HDU 4897 Little Devil I(树链剖分)(2014 Multi-University Training Contest 4)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4897 Problem Description There is an old country and ...