《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: ...
随机推荐
- windows开发hadoop文件系统权限错误
org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRI ...
- 面向对象编程思想(OOP)
本文我将从面向对象编程思想是如何解决软件开发中各种疑难问题的角度,来讲述我们面向对象编程思想的理解,梳理面向对象四大基本特性.七大设计原则和23种设计模式之间的关系. 软件开发中疑难问题: 软件复杂庞 ...
- OTG 接口烧写最小Linux的方法
通过该方式可以烧写Android4.0.3 系统和Linux-QT 系统. 需要准备一根OTG 线,绝大多数智能手机和PC 机相连接的线都是OTG线,都是通用的. 这种方式比TF卡烧写方式要快一些,我 ...
- weblogic对jms实现的QueueConnection实现与TopicConnection实现问题
今天看了一段之前同事写jms的代码,觉得好像不对,但是不可能,生产上用的代码.刚开始想了下,脑子没转过弯来,后来一想是个简单的问题 代码如下: topicConnection = (TopicConn ...
- json在action,$.ajax{}中的使用
首先需导入包:ezmorph-1.0.4.jar Action中的调用的方法: public void getObject(){ try { if(cname!=null&& ! ...
- Redo丢失场景和处理方法
Redo丢失场景和处理方法 Type of Failure Status Column of V$LOG Action One member failed in multiplexed group N ...
- 实验十三_编写、应用中断例程_2 & 总结
编写并安装int 7ch中断例程,功能为完成loop指令的功能 参数:(cx)= 循环次数,(bx)= 位移 以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int.iret指令执行前后 ...
- PHP 小谈静态用法
1.静态的表现形式,在PHP中定义一个静态变量需要加入一个关键字——static,静态对象是属于类的,非静态对象是属于对象的 class Fenbi { public $changdu;//属于对象的 ...
- bat file handling, main: echo type *.txt >> />
echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令 echo 表示显示此命令后的字符 echo off 表示在此语句后所有运行的命令都不显示命令行本身 ...
- ASPNET服务端控件练习(一个机试题)
简单记录: 模糊查询的select语句的拼写 public List<Model.Student> GetWhereStudent(string name, string sub, str ...