标签:idg 指定 函数返回 state 成员函数重载 member 常量指针 func def
【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】资源管理
标签:idg 指定 函数返回 state 成员函数重载 member 常量指针 func def
原文地址:https://www.cnblogs.com/wyc199288/p/14402094.html