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++》的更多相关文章

  1. 《More Effective C#》读书笔记

    <More Effective C#>这本书,大概是四年前看完的,但只整理了一部分读书笔记,后面有时间的话,会陆续补充的. More Effective C# :使用泛型 More Eff ...

  2. C++学习书籍推荐《More Effective C++》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...

  3. ###《More Effective C++》- 基础议题

    More Effective C++ #@author: gr #@date: 2015-05-11 #@email: forgerui@gmail.com 一.仔细区别pointers和refere ...

  4. ###《More Effective C++》- 操作符

    More Effective C++ #@author: gr #@date: 2015-05-21 #@email: forgerui@gmail.com 五.对定制的"类型转换函数&qu ...

  5. ###《More Effective C++》- 异常

    More Effective C++ #@author: gr #@date: 2015-05-24 #@email: forgerui@gmail.com 九.利用destructors避免泄漏资源 ...

  6. 《More Effective C++》读书笔记(零)Basic 基础条款

    这是篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点.我推荐学C++的人都好好读一遍Effective C++ 系列,真是 ...

  7. 《More Effective C++ 》读书笔记(二)Exception 异常

    这事篇读书笔记,只记录自己的理解和总结,一般情况不对其举例子具体说明,因为那正是书本身做的事情,我的笔记作为梳理和复习之用,划重点.我推荐学C++的人都好好读一遍Effective C++ 系列,真是 ...

  8. 《MORE EFFECTIVE C++》条款20 条款21

    条款20 协助编译器实现返回值优化 当重载运算符的时候,比如+ - * / 这类运算符,该函数返回的值一定是个右值(即不能是引用),那么执行一次运算的开销可能会在临时对象上调用多次构造函数和析构函数, ...

  9. 《more effective C++》条款10 防止构造函数里的资源泄露

    构造函数也可能发生内存泄露,考虑如下程序: class A { public: A(int *p) { if(p!=NULL) num=p; ); //do something } private: ...

随机推荐

  1. play项目部署

    首先对于现场的数据库,一定要谨慎谨慎再谨慎,特别是保存有重要数据的. 使用expdp命令导入数据库: 事前准备: 1.确保linux服务器上已经正确安装oracle (10g以上版本) 2.有Xshe ...

  2. ASP.NET在删除掉数据库文件后报错处理

    在开发asp.net mvc程序时,默认时我们会使用LocalDB, 我们有时会以为删除掉App_Data目录就可以自动新建数据库,但是我们在网站重新启动后(进入Account)就会发现报如下错误: ...

  3. ios-通知简单示例

    通知是一种一对多的信息广播机制,一个应用程序同时只能有一个NSNotificationCenter(通知中心)对象,用来添加通知观察者或者说监听者,以及发送通知. 用的地方是:不同控制器的传值回调.d ...

  4. Javascript中Number()、parseIn()和parseFloat()的区别

    有3个函数可以把非数值转化成数值:Number().parseInt()和parseFloat().第一个函数,即转型函数Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值 ...

  5. 如何用Java解析CSV文件

    首先看一下csv文件的规则: csv(Comma Separate Values)文件即逗号分隔符文件,它是一种文本文件,可以直接以文本打开,以逗号分隔.windows默认用excel打开.它的格式包 ...

  6. escape()、encodeURI()、encodeURIComponent() difference

    escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码.所有的空格符.标点符号.特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编 ...

  7. [转]Java中的多线程你只要看这一篇就够了

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  8. Java基础(60):Java打包生成Jar和Javadoc说明文档,以及在另外的工程中导入和使用自己的Jar

    一.Jar包的导出 1.在Package Explorer中选中项目,右键,点击“Export”   2.在弹出框一次选择Java-->JAR file,点击Next   3.在新弹出的窗口选择 ...

  9. CS2013调试DLL

    需要打开两个项目,一个是Win32Project1,由这个项目创建DLL,注意要在DLL函数前加上__declspec(dllexport),这样就会还配套生成一个.lib 然后再打开一个项目,一般为 ...

  10. spark使用Hive表操作

    spark Hive表操作 之前很长一段时间是通过hiveServer操作Hive表的,一旦hiveServer宕掉就无法进行操作. 比如说一个修改表分区的操作 一.使用HiveServer的方式 v ...