别怕Linux编程

Google C++编程规范 – 第三十八条 -《运算符重载》

本原创文章属于《Linux大棚》博客。

博客地址为http://roclinux.cn

文章作者为roc wu

==

【规范】

除非极特殊情况,请不要对运算符进行重载,不要自定义其语义。

【定义】

类可以对诸如+或/等运算符的含义进行自定义,这样可以让类看起来像内置类型一样。对运算符””的重载可以允许我们通过它来创建类的对象。

【支持者的声音】

我们支持运算符重载,我们的理由是:

  1. 运算符重载可以让代码看起来更加的自然直观,就好像在操作内置类型(如int)一样。
  2. 运算符重载看上去更加的有意思,要比使用Equals()和Add()这样的函数名生动得多。
  3. 为了让一些模板函数工作正常,我们需要使用到运算符重载。
  4. 对于建立自定义类型来说,运算符重载是一种简洁明了的方式。

【反对者的声音】

虽然运算符重载非常的直观,但仍然存在一些弊端:

  1. 使用运算符重载,会让人们有一种误区,认为对对象进行加减乘除操作和对内建类型进行加减乘除操作一样的轻便快速。
  2. 使用运算符重载,会让我们不太容易定位到重载运算符调用的位置。如果调用Equals(),要比调用==更容易定位和搜索。
  3. 一些运算符还支持指针操作,这样很容易引入bug。比如foo + 4和&foo + 4的含义可能完全不同。但是编译器并不会对此做任何的抱怨,这就使得我们很难对此进行debug。
  4. 运算符重载,允许我们创造出新的语法格式,而这往往使经验丰富的C++开发者都会很不熟悉。
  5. 重载还经常会产生一些不符合预期的后果。比如当我们对&符号进行重载后,前置声明将变得不安全。

【结论】

总体来讲,还是不要进行运算符重载,尤其是对赋值运算符(=)重载,要严格避免,因为这会引入很多陷阱。你可以使用Equals()和CopyFrom()来代替运算符重载。另外,如果类需要进行前向声明,那么也要严格避免对&符号进行重载。

不要重载””运算符,避免引入自定义的语义。

然而,仍然会存在一些场景需要我们使用运算符重载来与模板或标准C++类(例如:operator<<(ostream&, const T&))进行互操作。所以,只要合乎情理,仍然是可以使用运算符重载的。但我们仍要尽量避免这样做。

不要对==和<进行运算符重载,以便我们可以在STL容器中将一个类作为key。相反,当你要声明一个容器时,应该分别创建“等于”和“比较”函数。

一些STL算法也需要我们重载==符号,此时,我们应该在文档中写清进行运算符重载的原因和用途。

谢谢!

发表您的评论

请您放心,您的信息会被严格保密。必填项已标识 *