索引
C++ | 【01 基础提议】More Effective C++🧡💛💚💙
C++ | 【02 运算符】More Effective C++🧡💛💚💙
C++ | 【03 异常】More Effective C++🧡💛💚💙
C++ | 【04 效率】More Effective C++🧡💛💚💙
C++ | 【05 技巧】More Effective C++🧡💛💚💙
C++ | 【06 杂项】More Effective C++🧡💛💚💙
33、在未来时态下开发程序
- 好的软件具有灵活性、健壮性、可靠性;
- 要在未来时态下开发软件,需要接受事务发生改变,现在是派生类,后续可能称为基类;
- 需要设计得易被人理解、维护、扩充;
- 用C++自身来表达设计上的约束条件,如防止、检测、修正错误,阻止堆对象、构造等根据需求;
- 尽可能封装,将实现细节为私有,使用无名的命名空间和文件内的静态对象或函数;
- 避免导致虚基类的设计,避免需要RTTI的设计;
- 禁止一条语句即导致代码重新编译、链接;
- 不能强迫客户升级系统或更改操作环境;
- 提供完备的类,即使现在还不使用;
- 及那个你的接口设计得常见操作并防止常见错误;
- 如果没有限制你不能通化你的代码,就通化它;
34、将非尾端类设计为抽象类
当基类和派生类之间的赋值问题,当允许基类间赋值,而阻止派生类通过基类指针进行赋值;
故将它们的共同属性抽取出,建立一个抽象类
class AbstractAnimal {
protected:
AbstractAnimal& operator=(const AbstractAnimal& rhs);
public:
virtual ~AbstractAnimal() = 0;
};
class Animal : public AbstractAnimal {
Animal& operator=(const Animal& rhs);
};
class Lizard : public AbstractAnimal {
Lizard& operator=(const Lizard& rhs);
};
class Chicken : public AbstractAnimal {
Chicken& operator=(const Chicken& rhs);
};
如何对库中类加入一个新的抽象类
从已存在的实体类中派生出你的实体类;
试图在类库的继承树的更高吃找到一个完成了所需功能的抽象类,进行继承;
用包容你试图继承的类的方法实现你的新类;
35、如何在同一程序中混合使用C++和C
1、名变换
C++编译器给程序的每个函数换一个独一无二的名字,由于C++中有函数重载;
如果声明了一个函数,则经过编译器可能改变;
在C++编译器下,当调用C函数时,要禁止名变换;
extern "C"{
.......
}
若在C编译器下,则不需使用extern "C"
故:
#ifdef __cplusplus
extern "C" {
#endif
// ....
#ifdef __cplusplus
}
#endif
2、静态初始化
静态初始化:于main执行前即被调用,静态的类对象、全局、命名空间中的、文件本体中的类对象构造函数;
应该用C++写main函数,才会有对象先被初始化;