C ++运算符技术

时间:2011-10-20 12:45:07

标签: c++ methods

程序员在堆栈溢出时提到过,如果你声明了一个类函数,例如:

operator++()

出于用户界面目的(因为用户自然认为其相反应该起作用),你应该声明另一个:

operator--()

是否有指向支持此内容的文章的链接?我希望能够将它引用给其他程序员。

我想补充一点,也许这个建议类似于rule of 3the big 2

根据hostilefork的回答,也许相反的函数应该声明,即使它不服务于某个目的,但作为私有,所以用户明确知道他们不能调用该函数?或者那只是迂腐?

6 个答案:

答案 0 :(得分:7)

这在很大程度上取决于类的语义。例如,前向迭代器将始终定义operator ++,但从不定义operator - 。

如果增加某些内容与递减某些内容同样有意义,那么我同意原始声明,但肯定会有一个有意义但另一个没有意义的情况。

答案 1 :(得分:4)

我会说这个建议是不准确的。

反例是一个前向迭代器。例如,单链表上的迭代器不能倒退,因此operator - ()没有任何意义。

答案 2 :(得分:2)

我不认为如果你声明一个运算符(比如说operator ++())那么你必须声明另一个运算符(operator --())。它总是在需要的基础上。如果您需要operator --(),请声明它。

  

用户自然认为其相反应该起作用

在某些情况下,这种说法不正确。例如,你的程序每过一小时就会滴答作响并做一些事情。此处只有operator ++()可以适用。 operator --()甚至不可能。

答案 3 :(得分:2)

为什么呢?甚至标准的前向迭代器都没有:-)

答案 4 :(得分:2)

关于C ++和运算符重载的一个难点是它可能是一种双关语。重载赋值使用auto_ptr创建了一些腌制,因为试图将“赋值”视为理所当然的代码感到惊讶的是将A分配给B然后立即找到A!= B.

http://hostilefork.com/2009/07/10/smart-pointer-casting-study/

我将指出如果下面的通用代码将被编译,类的用户通常会认为它不会断言:

SomeType foo (...);
SomeType bar (foo);
foo++; // let's say we know this is safe
foo--; // then we'd generally hope this is safe also
assert(foo == bar); // ...and this is true
但是,没有法律强制执行。有些人声称容忍这样一个免费的语义是不好的:

http://yosefk.com/c++fqa/operator.html

我倾向于说保持一些这些期望很重要。但是没有编译一个减量不应该有意义的程序没有错。提到了前向迭代器,完美的例子。

你用语言得到的基本内容往往是非常“数学”和“对称”(就像一个整数不太可能有加法而不是减法)。但我认为,为解决特定问题而量身定制的课程趋向于从不对称中获得更大的价值。

这是一般性与特异性的事情。想想一个贴近用户的应用程序。他们不希望所有事情都能平等地获取......更常见的操作应该“容易”,而不频繁的操作可能会被边缘化。一些最令人沮丧的软件是那些不关注常见案例的软件。解决问题的专业类通常比通用语言结构或库更不对称。

答案 5 :(得分:1)

在提供运营商时,您可以获得的最重要建议是编程是关于的建模,您应该在中做任何自然的事情。如果在您的域中,由该类型建模的对象可以递增和递减,那么 design 应该支持这两个操作,如果在中只有一个操作存在,然后在设计中提供反向操作将使您的用户感到困惑。

编程不是关于在编译器中抛出代码以便可以执行它,而是关于解决特定问题。思考手头的问题,并以最自然的方式从那里开始工作。总体而言遵循Principle of least astonishment,因为这将使您的界面更容易正确使用,更难以正确使用。