读effective c++的笔记

允许我介绍80-20定律(参见条款M16)。它指出,在一个典型的程序中,80%的运行时间都花在执行20%的代码上。
条款11(好好阅读):用delete去删除一个已经被删除的指针,其结果是不可预测的。
条款12:尽量使用初始化而不要在构造函数里赋值。特别是const和引用数据成员只能用初始化,不能被赋值。
条款13:类成员是按照它们在类里被声明的顺序进行初始化的,和它们在成员初始化列表中列出的顺序没一点关系。
条款14:当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。如果声明虚析构函数为inline,将会避免调用它们时产生的开销,但编译器还是必然会在什么地方产生一个此函数的拷贝。
条款15:当定义自己的赋值运算符时,必须返回赋值运算符左边参数的引用,*this。如果不这样做,就会导致不能连续赋值,或导致调用时的隐式类型转换不能进行,或两种情况同时发生。编译器一般会产生这样的临时值(除非显式地定义了所需要的构造函数——见条款19),但注意临时值是一个const.
条款16:关于继承类的拷贝构造函数&赋值运算符函数的写法。
条款17:在operator=中检查给自己赋值的情况。
条款19:只有所涉及的构造函数没有声明为explicit的情况下才会这样,因为explicit构造函数不能用于隐式转换。需要访问非公有成员的非成员函数只能是类的友元函数。
假设f是想正确声明的函数,c是和它相关的类
.虚函数必须是成员函数。如果f必须是虚函数,就让它成为c的成员函数。
.operator>>和operator<<决不能是成员函数。如果f是operator>>或operator<<,让f成为非成员函数。如果f还需要访问c的非公有成员,让f成为c的友元函数。
.只有非成员函数对最左边的参数进行类型转换。如果f需要对最左边的参数进行类型转换,让f成为非成员函数。如果f还需要访问c的非公有成员,让f成为c的友元函数。
.其它情况下都声明为成员函数。如果以上情况都不是,让f成为c的成员函数。


条款26:为什么消除“对类成员的引用所产生的二义”时不考虑访问权限呢?有一个非常好的理由,它可以归结为:改变一个类成员的访问权限不应该改变程序的含义。
条款27:如果不想使用隐式生成的函数(赋值运算符函数、拷贝构造函数)就要显式地禁止它。
条款29:
string somefamousauthor()           // 随机选择一个作家名
{                                   // 并返回之

  switch (rand() % 3) {             // rand()在<stdlib.h>中
                                    // (还有<cstdlib>。参见条款49)
  case 0:
    return "margaret mitchell";     // 此作家曾写了 "飘",
                                    // 一部绝对经典的作品
  case 1:
    return "stephen king";          // 他的小说使得许多人
                                    // 彻夜不眠
  case 2:
    return "scott meyers";          // 嗯...滥竽充数的一个
  }                               
                                  

  return "";                        // 程序不会执行到这儿,
                                    // 但对于一个有返回值的函数来说,
                                    // 任何执行途径上都要有返回值
}
const char *pc = somefamousauthor();
1. 产生一个临时string对象用以保存somefamousauthor的返回值。
2. 通过string的operator const char*成员函数将临时string对象转换为const char*指针,并用这个指针初始化pc。
3. 临时string对象被销毁,其析构函数被调用。析构函数中,data指针被删除(代码详见条款11)。然而,data和pc所指的是同一块内存,所以现在pc指向的是被删除的内存--------其内容是不可确定的。
因为pc是被一个指向临时对象的句柄初始化的,而临时对象在被创建后又立即被销毁,所以在pc被使用前句柄已经是非法的了。也就是说,无论想做什么,当要使用pc时,pc其实已经名存实亡。

条款31:写一个返回废弃指针的函数无异于坐等内存泄漏的来临。
条款35:C++面向对象编程中一条重要的规则是:公有继承意味着 "是一个"。
条款36:纯虚函数最显著的特征是:它们必须在继承了它们的任何具体类中重新声明,而且它们在抽象类中往往没有定义。定义纯虚函数的目的在于,使派生类仅仅只是继承函数的接口。
为一个纯虚函数提供定义也是可能的。但调用它的唯一方式是通过类名完整地指明是哪个调用。
条款37:如果写类D时重新定义了从类B继承而来的非虚函数mf,D的对象就可能表现出精神分裂症般的异常行为。也就是说,D的对象在mf被调用时,行为有可能象B,也有可能象D,决定因素和对象本身没有一点关系,而是取决于指向它的指针所声明的类型。
条款41:涉及到"类的行为" 和 "类所操作的对象的类型"之间的关系时,你必须问自己这样一个问题:类型T影响类的行为吗?如果T不影响行为,你可以使用模板。如果T影响行为,你就需要虚函数,从而要使用继承。
· 当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。
· 当对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类。
条款42:如果两个类之间的继承关系为私有,编译器一般不会将派生类对象(如Student)转换成基类对象(如Person)。

 

 

 

 


*****在理解指针的时候,应该记住内存并不包含任何与之相关联的内在的解析。只有通过使用一个特定类型的指针拿一个特殊位置的比特才能解析为有意义的数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值