EazyChange

导航

 

【1】视C++为一个语言联邦

C++包含4个次语言:C,面向对象C++,模板,STL。

C:C++是以C语言为基础一门语言,其基本的blocks,statements,preprocessor等都是一样的

面向对象C++:封装,继承,多态

模板:泛型编程基础

STL:对容器,迭代器,算法紧密的配合与协调

 

【2】尽量用const,enum,inline替代#define

其原因是尽量用编译器替换预处理器。

const可以获取地址,但是enum和define不可以获取地址,方便隐藏。

 

【3】尽可能使用const

const是一个语义约束。指针常量&常量指针不必赘述。

(1)函数返回考虑加const,const int func() {}。看似无意义,其实是为了防止func() = val这样的操作,误把==写成=,触发一次转换

(2)两个成员函数如果仅是常亮性不同(尾部const,并非返回const),可以重载!!!!作用于const和non-const obj上——重要成员函数重载特性

 

【4】确定对象被使用前已先被初始化

避免“跨编译单元之初始化次序”。给出了一个方法:把非本地变量改为本地变量,其核心思想是:把全局的不确定初始化顺序的问题转换为在初始化的地方,动态调用函数来初始化从而约束初始化顺序。

比如一个类初始化以来另一个类的对象,但是不能确认两个类谁先初始化。那么可以在此类初始化时调用一个函数,该函数返回静态的另一个类的对象,及保证了该类初始化时另一个类必然初始化了。

 

【5】了解C++默默编写并调用哪些函数

编译器默认创建public default的构造,拷贝,赋值函数

 

【6】若不想使用编译器自动生成的函数,就明确拒绝

禁止拷贝的方法

(1)声明为private——不好,因为member和friend函数可以调用

(2)从一个禁止拷贝的类private继承

(3)C++11引入delete——这个最好

 

【7】为多态基类声明virtual析构函数

 

【8】别让异常逃离析构函数

1. 析构一定要吞下异常,保证终止

2. 如果调用者需要做异常处理,则类需要提供处理函数,析构也需要保证调用处理函数

 

【9】不在构造和析构中调用virtual函数

因为在调的时候,都是在本类的构造或者析构,不体现父类或子类特性,多态失效。所以尽量在构造和析构中做简单的操作。

 

【10】令operator=返回一个reference to *this

 

【11】在operator=中处理“自我赋值”

建议的代码:

Widget& Widge::operator=(const Widget &rhs)
{
    if (this == &rhs)
        return *this;

    // assign rhs to this
    return *this;  
}

书上提出了一张更好的赋值,考虑了prefetching,caching,pipelining

Widget& Widge::operator=(const Widget &rhs)
{
    Widget tmp(rhs);
    swap(tmp);

    return *this;  
}

就是浪费了一些空间,不过没有分支,不打乱流水

 

【12】复制对象时勿忘其每一个成分

可以在子类的拷贝构造中指定父类的构造函数

 

【13】——【17】资源管理

 

posted on 2021-02-14 16:10  EazyChange  阅读(86)  评论(0编辑  收藏  举报