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++
。你如何区分它们?当您遇到 ++var
和 var++
时,编译器会生成代码来为它们调用 operator++
,但您不希望这样,因为现在您无法区分后缀和前缀增量运算符。
为了解决这个问题,同一语言的设计者添加了一个虚拟参数,int
。这样,编译器在遇到后缀 ++
时可以调用 operator++(0)
或 operator++(42)
(或任何你喜欢的数字,这并不重要。它是一个虚拟参数),并且只是一个operator++()
遇到前缀时。参数只是为了区分而已。
总而言之,这是一个语言设计问题。当涉及到设计决策时,自然而然地,肯定有其他解决方案(比如将它们命名为 operator_preinc()
和 operator_postinc()
),但这是 C++ 的设计者选择的。他们可能有他们的理由,也可能是任意选择的,因为可能所有其他选项的权重都差不多。
我知道如何制作前缀和后缀增量器。在我的 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++
。你如何区分它们?当您遇到 ++var
和 var++
时,编译器会生成代码来为它们调用 operator++
,但您不希望这样,因为现在您无法区分后缀和前缀增量运算符。
为了解决这个问题,同一语言的设计者添加了一个虚拟参数,int
。这样,编译器在遇到后缀 ++
时可以调用 operator++(0)
或 operator++(42)
(或任何你喜欢的数字,这并不重要。它是一个虚拟参数),并且只是一个operator++()
遇到前缀时。参数只是为了区分而已。
总而言之,这是一个语言设计问题。当涉及到设计决策时,自然而然地,肯定有其他解决方案(比如将它们命名为 operator_preinc()
和 operator_postinc()
),但这是 C++ 的设计者选择的。他们可能有他们的理由,也可能是任意选择的,因为可能所有其他选项的权重都差不多。