Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 过载++;和+;操作员_C++ - Fatal编程技术网

C++ 过载++;和+;操作员

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和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 : ';'    

    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++似乎允许使用后缀运算符,但会发出警告()。