C++箴言:视类设计为类型设计

C++箴言:视类设计为类型设计,第1张

C++箴言:视类设计为类型设计,第2张

在C++中,就像其他面向对象的编程语言一样,可以通过定义新的类来定义新的类型。作为一个C++开发人员,你花了很多时间来增加你的类型系统。这意味着你不仅是一个类设计者,还是一个类型设计者。重载函数和操作符,控制内存分配和回收,定义对象的初始化和终结过程——这些都在你的掌控之中。所以你要在类设计上投入很大的精力,这和语言设计者在语言内置类型的设计上是接近的。

设计良好的类具有挑战性,因为设计良好的类型具有挑战性。好的类型有简单自然的语法、直观的语义和一个或多个高效的实现。在C++中,一个没有计划的类设计使得上述任何一个目标都不可能实现。甚至一个类的成员函数的执行特征也可能受到它们的声明方式的影响。

那么,如何才能设计出高效的类呢?首先,你必须明白你所面临的问题。实际上,每堂课都需要你面对以下问题,而答案通常会导致你的设计受到限制:

应该如何创建和销毁新类型的对象?怎么做这些会影响到你的类的构造函数和析构函数的设计,以及内存分配和回收函数(operator new,operator new[],operator delete,operator delete[]),除非你不写。

对象的初始化和对象的赋值应该有什么区别?这个问题的答案决定了你的构造函数和赋值操作符的行为以及它们之间的区别。这对于不混淆初始化和赋值很重要,因为它们相当于不同的函数调用。

通过值传递对你的新类型的对象意味着什么?记住,复制构造函数定义了如何实现一种新的传值类型。

你的新型的法律价值有什么资格?通常,对于一个类的数据成员,只有一些值的组合是合法的。这些组合决定了您的类必须维护的不变量。这些不变量决定了您必须检查成员函数中的错误,尤其是您的构造函数、赋值操作符和“setter”函数。还可能影响你的函数抛出的异常,以及你的函数的异常规范(不太可能会用到)。
您的新类型适合继承图吗?如果您从现有的类继承,您将受到这些类的设计的约束,尤其是它们的函数是虚函数还是非虚函数。如果要允许其他类继承你的类,会影响你是否声明函数为虚,尤其是你的析构函数。

你的新类型允许什么类型转换?你的类型在其他类型的海洋中,那么你的类型和其他类型之间有转换吗?如果你想让类型T1的对象隐式地转换成类型T2的对象,你应该在类T1中写一个类型转换函数(例如,操作符T2 ),或者在类T2中写一个非显式的构造函数,这两个函数都应该能够用一个参数来调用。如果只允许显示转换,应该编写执行转换的函数,还应该避免用一个参数调用它们的类型转换运算符或显式构造函数。

什么运算符和函数对新类型有意义?这个问题的答案决定了你应该为你的类声明哪些函数。有些是成员函数,有些不是。

哪些标准功能不应该被接受?你需要声明这些是私有的。

可以访问新类型的哪些成员?这个问题可以帮助你决定哪些成员是公开的,哪些是受保护的,哪些是私有的。它还可以帮助您决定哪些类和/或函数应该是朋友,以及一个类嵌套在另一个类中是否有意义。

你的新型“未申报接口”是什么?它为性能考虑、异常安全和资源使用(例如,锁和动态内存)提供了什么样的保证?您在这些方面提供的保证将强制实现您的类。

你的新类型多才多艺?也许你并不想定义一个新的类型。也许你需要定义一整个类型家族。如果是这样,就不需要定义新的类,只需要定义新的类模板。

你真的需要一种新的类型吗?你能不能定义一个新的继承类,这样你就可以给一个现有的类添加一些功能?也许通过简单地定义一个或多个非成员函数或模板,您可以更好地实现您的目标。

这些问题很难回答,所以定义高效类很有挑战性。既然C++中用户自定义类生成的类型至少可以和内置类型一样好,那么做好它,它会让所有的努力都是值得的。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++箴言:视类设计为类型设计

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情