设计好一个类是非常不容易的。需要考虑的地方很多:
# 要考虑这个类如何被创建和销毁
对应的就是对构造函数和析构函数的考虑。
# 要考虑类初始化和赋值的差异
类的初始化发生在进入构造函数之前,如果有初始化列表,就使用类成员对象的拷贝构造函数。如果没有初始化列表,就使用默认的构造函数。对于类的设计,这个地方要重点考虑吗?还不能理解。作者反复强调初始化和赋值的区别,在实际工程中除了const对应的问题,很少在代码上大规模使用初始化列表。
# 如何设计拷贝构造函数
设计一个类的时候要注意编译器会自动帮你创建默认构造函数,拷贝构造函数,拷贝赋值函数,析构函数。这些函数要不要用默认的,要考虑清楚
# 考虑好新类的继承关系
如果是继承自其他类,那么要考虑实现上virtural函数。如果要支持别人来继承,那要设计virtural函数。
# 考虑类的类型转换
如果你希望你的对象能够隐式转换到另一种类型,那么一种方案是在你设计的类中添加相应的运算符。 另一种方案是在要转换的类种添加对应的拷贝构造函数。并且这个拷贝构造函数是单入参,并没有explicit的修饰。
# 考虑类需要哪些运算符和函数接口
这些接口是public属性还是private属性等等
# 考虑哪些编译器自动创建的函数需要屏蔽掉
# 考虑这个类的性能,异常安全,资源安全
# 考虑是否真的需要这个类
如果你只是想在一个类的基础上添加一个特殊的处理函数,这种情况下,一种选择是继承派生出一个子类,然后在子类中添加这个函数。如果这是你添加新类的目的,那么要考虑是否可以用第二个方案。即不添加新类,继续沿用基类,需要的功能,用non_mumber函数实现(也就是用一个全局的函数来实现)。
单独实现这个处理函数,感觉跟面向对象的封装概念有冲突。这里的权衡参考item23。
网友评论