Effective C++读书笔记:类和函数:设计与声明

  • A+
所属分类:体育平台

Effective C++读书笔记:类和函数:设计与声明

在程序中声明一个新类将会产生一种新的类型:类的设计就是类型设计。

设计一个好的类很具有挑战性,因为设计好的类型很具有挑战性。好的类型具有自然的语法,直观的语义和高效的实现。

那么,怎么着手设计高效的类呢?实际上设计每个类时都会遇到下面的问题,它的答案将影响到你的设计。

对象将如何被创建和摧毁?

它将极大地影响构造函数和析构函数的设计,以及自定义的 operator new, operator new[], operator delete, 和 operatordelete[]。

对象初始化和对象赋值有什么不同?

答案决定了构造函数和赋值运算符的行为以及它们之间的区别。

通过值来传递新类型的对象意味着什么?

记住,拷贝函数负责对此做出回答。

新类型的合法值有什么限制?

这些限制决定了成员函数(特别是构造函数和赋值运算符)内部的错误检查的种类。它可能还影响到函数抛出的例外的种类以及函数的例外规范,如果你使用它们的话。

新类型符合继承关系吗?

如果是从已有的类继承而来,那么新类的设计就要受限于这些类,特别是受限于被继承的类是虚拟的还是非虚拟的。如果新类可被继承,这将影响到函数是否要声明为虚拟的。

允许哪种类型转换?

如果允许类型 A 的对象隐式转换为类型 B 的对象,就要在类 A 中写一个类型转换函数,或者,在类 B 中写一个可以用单个参数来调用的非 explicit 构造函数。如果只允许显式转换,就要写函数来执行转换功能,但不用把它们写成类型转换运算符和或单参数的非 explicit 构造函数。

什么运算符和函数对新类型有意义?

答案决定了将要在类接口中声明什么函数。

哪些运算符和函数要被明确地禁止?

它们需要被声明为 private。

谁有权访问新类型的成员?

这个问题有助于决定哪些成员是公有的,哪些是保护的,哪些私有的。它还有助于确定哪些类和/或函数必须是友元,以及将一个类嵌套到另一个类中是否有意义。

新类型的通用性如何?

也许你实际上不是在定义一个新的类型,而是在定义一整套的类型。如果是这样,就不要定义一个新类,而要定义一个新的类模板。

这些都是很难回答的问题,所以 C++中定义一个高效的类远不是那么简单。但如果做好了,C++中用户自定义的类所产生的类型就会和固定类型几乎没什么区别,如果能达到这样的效果,其价值也就体现出来了。

上面每一个问题如果要详细讨论都可以单独组成一本书。所以后面条款中所介绍的准则决不会面面俱到。但是,它们强调了在设计中一些很重要的注意事项,提醒一些常犯的错误,对设计者常碰到的一些问题提供了解决方案。很多建议对非成员函数和成员函数都适用,所以本章节考虑了全局函数和名字空间中的函数的设计和声明。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: