C++在重载运算符时如何知道增量++是前缀还是后缀

How does C++ know that an increment ++ is prefix or postfix when overloading the operator

我知道如何制作前缀和后缀增量器。在我的 class DoStuff 中,我有:

// Prefix; returns the incremented value
friend const DoStuff& operator++(DoStuff& a);
// Postfix: returns the incremented value
friend const DoStuff operator++(DoStuff& a, int);

在class之外,我有

const DoStuff& operator++(DoStuff& a){
    a.num++;
    return a;
}

const DoStuff operator++(DoStuff& a, int){
    DoStuff before(a.num);
    a.num++;
    return before;
}

分别用于前缀和后缀增量器。我不明白的是C++怎么知道前者用++a表示,后者用a++表示。据我所知,前缀增量符引用地址 & 并且这意味着 ++ 运算符符号应该位于它之前。 另外,我不太清楚为什么后缀需要一个 int 变量。

当编译器读取您的源代码时,它可以判断您使用的是前缀还是后缀。非常简单:++ 出现在某个对象之前或之后。

然后编译器会生成代码来调用正确的函数。但是那个函数的名字是什么?设计 C++ 的人决定将重载运算符的函数名称设为 operator,后跟要重载的运算符(++--= 等),例如 operator*operator-、等等

但现在的问题是前缀和后缀增量运算符都被命名为operator++。你如何区分它们?当您遇到 ++varvar++ 时,编译器会生成代码来为它们调用 operator++,但您不希望这样,因为现在您无法区分后缀和前缀增量运算符。

为了解决这个问题,同一语言的设计者添加了一个虚拟参数,int。这样,编译器在遇到后缀 ++ 时可以调用 operator++(0)operator++(42)(或任何你喜欢的数字,这并不重要。它是一个虚拟参数),并且只是一个operator++() 遇到前缀时。参数只是为了区分而已。

总而言之,这是一个语言设计问题。当涉及到设计决策时,自然而然地,肯定有其他解决方案(比如将它们命名为 operator_preinc()operator_postinc()),但这是 C++ 的设计者选择的。他们可能有他们的理由,也可能是任意选择的,因为可能所有其他选项的权重都差不多。