C++ 过载++;和+;操作员
为什么我可以重载并在LHS和RHS中使用C++ 过载++;和+;操作员,c++,C++,为什么我可以重载并在LHS和RHS中使用++操作符,而++操作符只能在LHS模式下工作 class B { public: string operator ++ () { return "hello"; } string operator + () { return "hello2"; } }; int main () { B b; string s = +b ; s = b+ ; // compile error syntax error : ';
++
操作符,而++
操作符只能在LHS模式下工作
class B {
public:
string operator ++ () { return "hello"; }
string operator + () { return "hello2"; }
};
int main ()
{
B b;
string s = +b ;
s = b+ ; // compile error syntax error : ';'
s = b++;
s = ++b;
return 0;
}
重载运算符只能使用与相应内置运算符相同的语法。内置的
++
被定义为前缀或后缀运算符;内置的+
仅定义为前缀运算符(当然也定义为二进制运算符)
请注意,即使没有b++
行,您的代码也无法编译,因为您缺少++
的后缀版本:
string operator ++ (int) { return "postfix"; }
重载运算符只能使用与相应内置运算符相同的语法。内置的
++
被定义为前缀或后缀运算符;内置的+
仅定义为前缀运算符(当然也定义为二进制运算符)
请注意,即使没有b++
行,您的代码也无法编译,因为您缺少++
的后缀版本:
string operator ++ (int) { return "postfix"; }
为什么我可以重载并在LHS和RHS中使用++运算符
您的代码实际上:
实际上,您没有重载增量后操作符,只有增量前操作符。然而,您的问题仍然存在,因为如果您想加载,则可以超载后增量,但C++不提供类似的语法来重载一个后缀一元加操作符。
C++不会改变基于运算符重载解析表达式中运算符的方式。它只允许您重载已经存在的运算符,并且这些运算符将被解析,就像运算符重载不存在一样。只有在解析之后,C++才会查看操作符重载来确定解析表达式的含义。因此C++提供了一种方法来加载后增量运算符,因为它已经处理了解析后增量运算符,但是它还没有处理解析后缀加操作符。
限制C++操作符重载到现有运算符,因为如果分析器不小心操作符的任意使用,则实现解析器更简单。然而,这并不意味着它不能完成。例如,语言Swift允许对二进制、前缀一元和后缀一元运算符进行任意运算符重载,包括创建
为什么我可以重载并在LHS和RHS中使用++运算符 您的代码实际上: 实际上,您没有重载增量后操作符,只有增量前操作符。然而,您的问题仍然存在,因为如果您想加载,则可以超载后增量,但C++不提供类似的语法来重载一个后缀一元加操作符。 C++不会改变基于运算符重载解析表达式中运算符的方式。它只允许您重载已经存在的运算符,并且这些运算符将被解析,就像运算符重载不存在一样。只有在解析之后,C++才会查看操作符重载来确定解析表达式的含义。因此C++提供了一种方法来加载后增量运算符,因为它已经处理了解析后增量运算符,但是它还没有处理解析后缀加操作符。限制C++操作符重载到现有运算符,因为如果分析器不小心操作符的任意使用,则实现解析器更简单。然而,这并不意味着它不能完成。例如,语言Swift允许对二进制、前缀一元和后缀一元运算符进行任意运算符重载,包括创建。
因为“b+”是该运算符的无效语句,重载或notC仅以前缀形式定义一元+
,而++
和--
是以前缀和后缀形式定义的。C++允许你指定给表达式的执行,但不改变基本语法,不管你是否允许,所以你仍然只能得到一元前缀形式的代码> > + />代码。因为“B+”是那个操作符的一个无效语句,重载或NoC只定义了一元代码>代码> +代码>。而++
和--
是以前缀和后缀形式定义的。C++允许你指定给表达式的执行,但是不改变基本语法,不管你是否允许,所以你仍然只能得到一元前缀的形式:“代码> +代码>代码。我的Visual C++编译我的代码没有问题。但当我把你的台词包括进来时,我得到了不同的行为(这是意料之中的)。但是为什么使用is(int)呢?为什么不使用char呢?@vico:我不知道为什么VC++会接受它,但更标准的编译器不会<代码>(int)是表示后缀形式的方式。没有特别的理由选择它,而不是char
或其他什么;但是选择了<代码> int /COD>,这就是我们必须使用的。VC++允许如果定义了前缀操作符(并赋予它相同的行为),使用后缀操作符,但发出警告()。但当我把你的台词包括进来时,我得到了不同的行为(这是意料之中的)。但是为什么使用is(int)呢?为什么不使用char呢?@vico:我不知道为什么VC++会接受它,但更标准的编译器不会<代码>(int)是表示后缀形式的方式。没有特别的理由选择它,而不是char
或其他什么;但是选择了int
,所以这就是我们必须使用的。如果定义了前缀运算符(并给出了相同的行为),VC++似乎允许使用后缀运算符,但会发出警告()。