Effective C++读书笔记(5)

来源:互联网 发布:用友软件现金流量表 编辑:程序博客网 时间:2024/05/08 05:36
(1)条款19提到:设计class如设计type
(2)尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,并且可以避免切割问题
        切割问题:如果一个子类被pass-by-value到一个父类身上,那么在调用父类方法的时候,实际上使用的是父类实现而不是子类
        对编译器来说,传值给一个父类,相当于:声明父类,将子类作为拷贝构造函数的参数传给父类,所以对系统来说这里只有父类,不存在子类,就更加不可能调用子类的方法。而const A& a 传入则可以避免这个问题。而const也可以保证子类在函数中不被修改。
        以上规则不适用与内置类型,以为STL的迭代器和函数对象,对它们而言,传值比较妥当
(3)绝对不要返回一个指向local stack的pointer或者reference,也不要返回一个指向local static对象的指针或者引用
(4)要尽量将成员变量声明为private,只有这样才能提供良好的延伸性
(5)protected不比public具有更好的封装性
(6)宁可拿non-member non-firend函数替换member函数,这样可以增加封装性,包裹弹性,机能扩充性
           为了更好的组织,non-member non-firend函数可以与类声明位于相同的namespace内,
            namespace可以跨文件,可以将“浏览器类”放入一个头文件,之后“书签相关处理函数”放入一个头文件,“历史处理”放入一个,所有的都使用同一个命名空间,这样如果用户只想要浏览网页和管理书签,而对历史处理不感兴趣的话,那么就可以只#include“浏览器类头文件”和“书签相关类头文件”
            这样有利于更好的组织
(7)如果所有参数都需要转换,可以采用non-member函数(条款24)
例子:在Rational类的同一个namespace中生命该non-member函数
const Rational opreator* (const Rational& lhs, (const Rational& rhs)
{
        return Rational(........)
}
这与编译器的调用机制有关

    
0 0
原创粉丝点击