条款29: 避免返回内部数据的句柄
1) 对于const成员函数来说,返回句柄是不明智的,因为它会破坏数据抽象。
2) 对于非const成员函数来说,返回句柄会带来麻烦,特别是涉及到临时对象时。
评论:内部数据是受保护的,将其句柄传递出去,相当于违反内部数据受保护这一原则。C++是面向对象的方法编程,要尽量不面向对象的数据编程。条款30: 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低
评论:内部数据是受保护的,将其句柄传递出去,相当于违反内部数据受保护这一原则。条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针的引用
评论:局部变量在超出局部范围访问是非法的。函数内部new的类型实例,内存由谁来释放是一个有争议的问题,常会导致内存泄露。条款32: 尽可能地推迟变量的定义
评论:推迟变量定义可以提高程序的效率,增强程序的条理性,还可以减少对变量含义的注释。这也是常说的就近原则。
C++内联函数规则:
1) 旧规则:对于未被内联的内联函数,编译器把它当成被声明为static那样处理,即,使它局限于当前被编译的文件。
2) 新规则:不管涉及的被编译单元有多少,将只生成唯一一个内联函数的外部拷贝
C++内联函数没有被内联的缺点:
1) 无论新、旧规则,如果内联函数没被内联,每个调用内联函数的地方还是得承担函数调用的开销。
2) 旧规则得忍受代码体积的增加,因为每个包含(或调用) 内联函数的被编译单元都有一份代码及其静态变量的拷贝。
5) 旧规则内联函数的拷贝都一份static局部变量拷贝,这必然会让程序员大吃一惊,因为一般来说,函数中的"static"意味着"只有一份拷贝"。
6) 旧规则更糟糕的是,每个内联函数拷贝以及每个内联函数的静态变量的拷贝往往处于不同的虚拟内存页面,所以两个对内联函数的不同拷贝进行调用有可能导致多个页面错误。
条款33: 明智地使用内联
评论:对于内联函数,大多数编译器都可以设置诊断级,当声明为内联的函数实际上没有被内联时,编译器就会为你发出警告信息(参见条款48)。
条款34: 将文件间的编译依赖性降至最低
1) 如果可以使用对象的引用和指针,就要避免使用对象本身。定义某个类型的引用和指针只会涉及到这个类型的声明。定义此类型的对象则需要类型定义的参与。
2) 尽可能使用类的声明,而不使用类的定义。因为在声明一个函数时,如果用到某个类,是绝对不需要这个类的定义的,即使函数是通过传值来传递和返回这个类。
3) 不要在头文件中再(通过#include指令)包含其它头文件,除非缺少了它们就不能编译。
4) 柄类和协议类分离了接口和实现,从而降低了文件间编译的依赖性。它在运行时会多耗点时间,也会多耗点内存。分离的关键在于,"对类定义的依赖" 被 "对类声明的依赖" 取代了。
评论:解耦的原则需要深入人心,不管任何事情,纠结在一起,就越难处理,如果能够分解开来,单独处理,那么我们就一个一个简单处理,最终将会豁然开朗。
第一章:从C转向C++ (Effective C++ Second Edition 读书笔记)
第二章:内存管理(Effective C++ Second Edition 读书笔记)
第三章:构造函数,析构函数和赋值操作(Effective C++ Second Edition 读书笔记)
第四章 类和函数:设计与声明(Effective C++ Second Edition 读书笔记)
第五章 类和函数:实现(Effective C++ Second Edition 读书笔记)第六章 继承和面向对象设计 (Effective C++ Second Edition 读书笔记)