More Effective C++读书笔记---技巧

来源:互联网 发布:网络电视品牌哪个好用 编辑:程序博客网 时间:2024/06/02 11:40

技巧

二十五、条款25--将构造函数和非成员函数虚拟化
1.虚拟构造函数是指能够根据输入给它的数据的不同而建立不同类型的对象
2.被派生类重定义的虚拟函数不用必须与基类的虚拟函数具有一样的返回类型。如果函数的返回类型是一个指向基类的指针(或一个引用),那么派生类的函数可以返回一个指向基类的派生类的指针(或引用)
3.就像构造函数不能真的成为虚拟函数一样,非成员函数也不能成为真正的虚拟函数。然而,既然一个函数能够构造出不同类型的新对象是可以理解的,那么同样也存在这样的非成员函数,可以根据参数的不同动态类型而其行为特性也不同
4.具有虚拟行为的非成员函数很简单。你编写一个虚拟函数来完成工作,然后再写一个非虚拟函数,它什么也不做只是调用这个虚拟函数。为了避免这个句法引起函数调用开销,你当然可以内联这个非虚拟函数
二十六、条款26--限制某个类所能产生的对象数量
1.阻止建立某个类的对象,最容易的方法就是把该类的构造函数声明在类的private域
2.任何能在全局域声明东西也能在命名空间里声明。包括类、结构、函数、变量、对象、typedef等等
3.为什么你要把对象声明为静态的呢?通常是因为你只想要对象的一个拷贝。现在再考虑内联意味着什么?从概念上讲,它意味着编译器用函数体替代对函数的每一个调用,不过非成员函数还不只这些。它还意味着internal linkage(内部链接)
4.带有内部连接的函数可能在程序内被复制(也就是说程序的目标(Object)代码可能包含一个以上的内部链接函数的代码),这种复制也包括函数内的静态对象。结果如何?如果建立一个包含局部静态对象的非成员函数,你可能会使程序的静态对象的拷贝超过一个!所以不要建立包含静态数据的非成员函数
二十七、条款27--要求或禁止在堆中产生对象
1.要求在堆中建立对象:非堆对象在定义它的地方被自动构造,在生存时间结束时自动被释放,所以只要禁止使用隐式的构造函数和析构函数,就可以实现这种限制。把这些调用变的不合法的一种最直接的方法是把构造函数和析构函数声明为private。这样做副作用太大。没有理由让两个函数都是private。最好让析构函数为private,让构造函数为publi c。你可以引进一个专用的伪析构函数,用来访问真正的析构函数。客户端调用伪析构函数释放他们建立的对象
2.异常处理体系要求所有在栈中的对象的析构函数必须申明为公有
3.另一种方法是把全部的构造函数声明为private
4.通过限制访问一个类的析构函数或它的构造函数来阻止建立非堆对象,但这种方法也禁止了继承和包容。当然也不是不能克服,把析构声明为protected可解决继承;把包容的对象改为包容的指针即可
5.判断一个对象是否在堆中:无法通过“地址对比”来确定对象是在堆上或栈上或其他地方
6.mixin("mix in")类提供某一特定的功能,并可以与其继承类提供的其他功能相兼容。这种类几乎都是抽象类。因此我们能够使用抽象混合(mixin)基类给派生类提供判断指针指向的内存是否由operator new分配的能力
7.禁止堆对象:通常对象的建立这样三种情况,对象被直接实例化;对象做为派生类的基类被实例化;对象被嵌入到其他对象内
8.禁止用户直接实例化对象很简单,因为总是调用new来建立这种对象,你能够禁止用户调用new。你不能影响new操作符的可用性,但是你能够利用new操作符总是调用operator new函数这点,来达到目的。你可以声明这个函数,而且你可以把它声明为private。但operator new是private这一点,不会对包含该类成员对象的分配产生任何影响
二十八、条款28--灵巧(smart)指针
1.灵巧指针是一种外观和行为都被设计成与内建指针相类似的对象,不过它能提供更多的功能。它们有许多应用的领域,包括资源管理和重复代码任务的自动化
2.灵巧指针从模板中生成,因为要与内建指针类似,必须是strongly typed(强类型)的;模板参数确定指向对象的类型
二十九、条款29--引用计数
三十、条款30--代理类
三十一、让函数根据一个以上的对象来决定怎么虚拟

原创粉丝点击