EffectiveC++笔记.md

建议使用初始化而不要在构造函数里赋值
确定虚基类有虚析构函数

不要返回局部对象的引用,也不要返回函数内部new出来的指针
必须返回对象时不要试图返回一个引用。可以返回一个新的对象,或者等价的方式。也可以使用非const引用接收结果。

降低编译依赖,使用向前声明。
尽可能使用类的声明,而不使用类的定义。
如果可以使用对象的引用和指针,就要避免使用对象本身。

继承和模板
当对象的类型不影响类中函数的行为时,需要使用模板来生成这样一组类。
当对象的类型影响类中函数的行为时,就要使用继承来得到一组类。

避免对指针和数字类型重载
void f(int x);
void f(string ps);
若出现以上函数,f(0)中,0总是一个int类型。
NULL常量需要兼容所有的指针类型(void
),直接使用需要一个显式类型转换。

这个问题可以消除,但需要使用C++语言最新增加的一个特性:成员函数模板(往往简称为成员模板)。
我们需要一个“对每一个T类型,运作起来都象static_cast<T*>(0)表达式”的对象。
即,使NULL成为一个“包含一个隐式类型转换运算符”的类的对象,这个类型转换运算符可以适用于每种可能的指针类型。

我们只需要定义一个匿名类并使NULL成为这种类型。
第二,既然我们是想让NULL可以转换为任何类型的指针,那就也要能够处理成员指针。这就需要定义第二个成员模板,它的作用是为所有的类C和所有的类型T,将0转换为类型T C::*(指向类 C里类型为T的成员)。
最后,要防止用户取NULL的地址,因为我们希望NULL的行为并不是象指针那样,而是要象指针的值,而指针的值(如0x453AB002)是没有地址的。

const class{
    public:
        template<class T>
        operator T*() const { return 0; }           // 可以转换任何类型的null非成员指针

        template<class C, class T>
        operator T C::*() const { return 0; }       // 可以转换任何类型的null成员指针

    private:
        void operator&() const;                     // 不允许取地址

}NULL;                                              // 名称为NULL

标准库支持三种报错方式:C的断言,错误号,异常。
异常的层次结构:
exception
logic_error
domain_error
invalid_argument
length_error
out_of_range
runtime_error
range_error
underflow_error
overflow_error

标准库的算法效率:
容器的性能保证,如vector必须提供对内在元素的,常量时间内的访问
算法的性能保证,如stable_sort算法执行时要求不超过(NlogN)。

C++的标准官方名称:International Standard for Imformation System—Programming Language


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 using1174@foxmail.com

文章标题: EffectiveC++笔记.md

文章字数: 729

本文作者: Jun

发布时间: 2021-06-27, 17:33:00

最后更新: 2022-03-15, 14:20:48

原始链接: http://yoursite.com/2021/06/27/EffectiveC++笔记/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏