《C++代码设计与重用》——2.2 正规函数

简介:

本节书摘来自异步社区出版社《Imperfect C++中文版》一书中的第2章,第2.2节,作者: 【美】Martin D.Carroll , Margaret A.Ellis,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 正规函数

C++代码设计与重用
2.2 正规函数
对所有提供它们的类而言,某些函数应该具有相同的语义。考虑类Rational的拷贝构造函数:

class Rational {
public:
     Rational(const Rational& r);
     //...
};

上面的操作将会构造一个Rational对象,它的值等同于对象r的值(我们所说的值总是指抽象值)。我们认为,每个类的拷贝构造函数都应该具有这样的语义,就是构造一个和它的参数等值的对象。尽管C++没有—也不能—强制拷贝构造函数遵循这种约束,但每个设计良好的C++类都应该遵守这种约束。

如果在所有设计良好的类中,某个函数的语义都是相同的话,我们就称这个函数为正规函数。C++中的正规函数有:

拷贝构造函数;
析构函数;
基本的赋值运算符(指类T的赋值运算符,它的唯一参数的类型是const T&或T);
相等运算符和不等运算符。
下面的类T显式声明了(上面)这些正规函数:

class T {
public:
     T(const T& t);
     ~T();
     const T& operator=(const T& t);
      //...
};
bool operator==(const T& t1, const T& t2);
bool operator!=(const T& t1, const T& t2);

在这里,我们将相等运算符和不等运算符声明成全局函数。当然,它们也可以作为类T的成员函数。(bool类型是C++新增的类型,它有真和假两种值,真值用新关键字true来表示,假值用新关键字false来表示。)

正规函数的语义如下:

T::T(const T& t);

创建一个T对象,它的(抽象)值和t对象的(抽象)值相等。

T::~T();

销毁T对象。

const T& T::operator=(const T& t)

用参数t的值给这个新对象赋值,并返回一个此对象的引用。

bool operator==(const T& tl, const T& t2);

当且仅当tl和t2具有相同的值时,返回true。

bool operator!=(const T& tl, const T& t2);

当且仅当tl和t2具有不同的值时,返回true。

上面这些正规语义都是抽象的;当然,它们也就有许多种合理的底层实现方法。(实际上,对于operator= =和operator!=这两个运算符,为了确保能够准确无误的实现,它们其中的一个是根据(通过调用)另一个的实现细节来实现的。)即使上面所给函数是由编译器隐式生成的(构造函数,析构函数和赋值运算符是可以由编译器隐式生成的)1,或者是成员函数,而不是全局函数(双目运算符往往实现成全局函数),这些语义还是成立的。

对所有设计良好的代码,它们所有正规函数的语义都是相同的,所以,(严格说来)给函数的语义添加帮助文档是没有必要的。然而,一些过于谨慎的C++程序库设计者为了确保用户可以了解添加的正规函数,往往在很多地方添加了正规函数语义的帮助文档,但这样做的意义并不大。

1关于编译器如何实现这3个函数,具体请参阅Inside the C++Object Model,但有一规则就是:拷贝构造函数、析构函数和赋值运算符这3个函数,要么都由编译器隐式生成,要么都由用户提供具体实现,具体参阅Herb Sutter在CUJ的Conversation.
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关文章
|
1月前
|
C++
C++ 数学函数、头文件及布尔类型详解
C++ 支持数学操作,如`max`和`min`函数找最大值和最小值,以及`<cmath>`库中的`sqrt`、`round`等数学函数。`bool`类型用于布尔逻辑,取值`true`(1)或`false`(0)。布尔表达式结合比较运算符常用于条件判断,例如在`if`语句中检查年龄是否达到投票年龄。在代码示例中,`isCodingFun`和`isFishTasty`变量分别输出1和0。
122 1
|
1月前
|
算法 C++ 容器
C++中模板函数以及类模板的示例(template)
C++中模板函数以及类模板的示例(template)
|
2月前
|
存储 设计模式 安全
【C++ 软件设计思路】多角度探索C++事件处理:以‘handlePowerEvent’函数为例
【C++ 软件设计思路】多角度探索C++事件处理:以‘handlePowerEvent’函数为例
85 2
|
2天前
|
存储 C++
c/c++宏定义(函数)
c/c++宏定义(函数)
|
4天前
|
编译器 C++
【C++进阶】引用 & 函数提高
【C++进阶】引用 & 函数提高
|
8天前
|
C++
C++从入门到精通:2.1.2函数和类——深入学习面向对象的编程基础
C++从入门到精通:2.1.2函数和类——深入学习面向对象的编程基础
|
8天前
|
存储 C++
C++从入门到精通:2.1.1函数和类
C++从入门到精通:2.1.1函数和类
|
16天前
|
机器学习/深度学习 定位技术 C++
c++中常用库函数
c++中常用库函数
38 0
|
17天前
|
算法 搜索推荐 C++
浅谈sort函数底层(一道c++面试的天坑题)
浅谈sort函数底层(一道c++面试的天坑题)
|
19天前
|
编译器 C++
C++ 解引用与函数基础:内存地址、调用方法及声明
C++ 中的解引用允许通过指针访问变量值。使用 `*` 运算符可解引用指针并修改原始变量。注意确保指针有效且不为空,以防止程序崩溃。函数是封装代码的单元,用于执行特定任务。理解函数的声明、定义、参数和返回值是关键。函数重载允许同一名称但不同参数列表的函数存在。关注公众号 `Let us Coding` 获取更多内容。
136 1