开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
在未来时态下发展程序
- 好的软件对于变化具有适应能力,就想设计模式讲的那样,抵御变化。世界总会变的,但是你应准备应因之道。设计代码,使得“系统改变所带来的冲击”得以局部化
- 以C++语言本身来表现各种规范而不是文档
请避免设计出virtual base classes,因为这种类必须被其每一个子类初始化。
只要有人删除B*而它指向D,便表示B需要一个虚析构。
如果多重继承中有任何的析构函数,那么每一个基类中都应该有虚析构。 - 提供完整的库,以我的库是被设计用来做什么用途的,用这种未来式的思维考量。
- 对于类的限制应该是从语法的层面来限制,而非文档
如限制类被继承时,可以通过final关键字限制
将非尾端类设计为抽象类
- 所谓部分赋值:父类间的赋值,子类不受影响,即赋值运算符非虚函数。所谓异型赋值:同是继承自A的B和C之间的赋值。
- 抽象类必须至少有一个纯虚函数,有时很难找到一个纯虚函数,可以让析构函数为出纯虚函数。但是需要在类外实现该纯虚函数。
- 将函数声明为纯虚函数并非暗示其无实现码,只是意味着
目前这个类是抽象,
任何继承自此类的具体类,都将为该纯虚函数声明一个正常的虚函数。 针对于纯虚函数而言,实现不仅是平常的事,也是必要的事。 - 面向对象的设计目标是辨识出有用的抽象性,并强迫他们成为抽象类。有用的抽象性为在多个环境(变化的环境)中都有用。
- 只要具体的类被当成基类使用,才强迫引入一个新的抽象类。
- 我们不太可能对自己不熟悉的概念设计出好的classes。当后期熟悉后再补上一个抽象类即可。
- 继承体系中的非尾端类应该为抽象类。
如何在同一个程序中结合C和C++
- 使用前(混合使用)请确定C和C++编译器产生兼容的目标文件。
- name mangling(名称重整)是一种程序,为程序内的每一个函数编出独一无二的名字(由于函数重载的原因)。如果在C库中调用C++函数会出现link错误(找不到函数),为此,需要告诉编译器不要重整某些函数的名称。而extern "C"会抑制重整
#ifdef _cplusplus
extern "C"
{
#endif // _cplusplus
#ifdef _cplusplus
}
#endif
- 静态的初始化:许多代码在main函数之前、之后调用。static class对象、全局对象、namespace内的对象和文件范围内的对象,其构造函数在main之前就得执行,同理,其析构函数是在main函数之后。如果C++编译器采用静态初始化的话,那就应该撰写main函数。完成这些对象的构造和析构。
- 动态内存的分配,以下配套使用:
new delete; new [] delete[]
malloc free - 将两个语言间的"数据结构传递"限制于C所能了解的形式;C++的struct如果内涵非虚函数则不受此限制;反之,如果有虚函数则有影响。对象指针、非成员函数指针、静态函数指针、内建的变量、部分struct可以安全的跨越C/C++边界。
让自己习惯C++语言
- 重新定义虚函数时,返回类型不再一定与原定义完全吻合。
- 所谓的std::string是basic_string<char>.是模板的泛化。
typedef basic_string<char> std::string
- STL
容器
迭代器
算法