C++备受一些人吐槽的一点是它在类的声明中既包含了实现细节又包含了接口细节,比如:
#include "Point.h"
class Circle {
public:
double Area(); // 接口
private:
double _radius; // 实现
Point _center; // 实现
};
这其中带来的很大的一个问题就是有时候即使只是改变类内容的实现细节(比如Point
类 定义发生了变化,或者把_radius
变成 float 类型),类的用户也需要重新编译自己的程 序(这通常称为编译依赖),这一点让很多人难以接受。(当然还存在其他问题,比如用户 知道了实现细节就可以通过一些手段欺骗编译器,写出一些依赖实现而不是依赖接口的代码 )。
这种方式来自C++的前身C With Class
,该语言的设计初衷是结合Simula
语言在程序组 织上的便利性和C语言本身的高效性。当年C++之父使用Simula
写模拟器,发现类的概念非 常好用,但是最终因为Simula
本身效率非常的低而不得不使用BCPL
语言重写。
他发现Simula
之所以低效的一个很重要的原因是无法在栈和静态数据区(存放全局变量、 静态变量的区域)中创建用户自定