C++; 在C++中,如果你有一个类FoO,并且你希望Foo的用户能够写: Foo x; x += 3; Foo x; int y = 3; y += x;

C++; 在C++中,如果你有一个类FoO,并且你希望Foo的用户能够写: Foo x; x += 3; Foo x; int y = 3; y += x;,c++,operator-overloading,operators,C++,Operator Overloading,Operators,,您只需创建Foo的一个成员函数,Foo&operator+=(int-rhs)。如果您希望能够书写: Foo x; x += 3; Foo x; int y = 3; y += x; ,您不能通过编写Foo的成员函数来实现这一点,而是必须编写一个外部函数,该函数通常必须声明为Foo的朋友 P>一个未来版本的C++,如果用FoO成员函数 int和操作符+=(int和LHS,反转)< /> >,其中一个空的类唯一的目的是区分两个版本的操作符,那么, >是什么? 如果这样做的话,它可能会消除新

,您只需创建Foo的一个成员函数,
Foo&operator+=(int-rhs)
。如果您希望能够书写:

Foo x;
x += 3;
Foo x;
int y = 3;
y += x;
,您不能通过编写Foo的成员函数来实现这一点,而是必须编写一个外部函数,该函数通常必须声明为Foo的朋友

<> P>一个未来版本的C++,如果用FoO成员函数<代码> int和操作符+=(int和LHS,反转)< /> >,其中一个空的类唯一的目的是区分两个版本的操作符,那么,<强> >是什么?
如果这样做的话,它可能会消除新代码中使用
friend
关键字的绝大多数情况。

事实上,您可以定义这样一个运算符,因为您可以自由重载内置类型的
+=

int& operator+=(int &lhs, Foo &rhs) {
  lhs += rhs.somefield;
  return lhs;
}
另一方面,不必为所有可能的运算符编写重载函数,还可以提供一个函数,允许将
类Foo
隐式转换为
int

class Foo {
  ... somefield;

  operator int() {
    return (int)somefield;
  }
};

实际上,您可以定义这样的运算符,因为您可以自由地为内置类型重载
+=

int& operator+=(int &lhs, Foo &rhs) {
  lhs += rhs.somefield;
  return lhs;
}
另一方面,不必为所有可能的运算符编写重载函数,还可以提供一个函数,允许将
类Foo
隐式转换为
int

class Foo {
  ... somefield;

  operator int() {
    return (int)somefield;
  }
};

我认为在不久的将来这不是一个选择。这感觉像是一个随机的想法,您必须打破成员
@=
运算符的规则。我想添加一个虚构的关键字,说
lhs
现在是
rhs
,但问题是“为什么?”。当前语法运行良好,没有任何意义。好吧,等10年,看看你已经可以定义那些操作符了。这不是一个随机的想法
operatorXxx
-方法可以在类之外定义,即使对于基元也是如此types@msrd0在班里没有宣布友谊?编辑:好的,读错了。我想我可能写了“可以在类之外定义”——但无论如何,阅读是一种错误hard@msrd0好吧,你仍然必须以某种方式声明它们,而你不能像一些没有友谊的
Foo
方法那样对基本类型声明它们,这就是重点。我认为在不久的将来这不是一个选择。这感觉像是一个随机的想法,您必须打破成员
@=
运算符的规则。我想添加一个虚构的关键字,说
lhs
现在是
rhs
,但问题是“为什么?”。当前语法运行良好,没有任何意义。好吧,等10年,看看你已经可以定义那些操作符了。这不是一个随机的想法
operatorXxx
-方法可以在类之外定义,即使对于基元也是如此types@msrd0在班里没有宣布友谊?编辑:好的,读错了。我想我可能写了“可以在类之外定义”——但无论如何,阅读是一种错误hard@msrd0好吧,你仍然必须以某种方式声明它们,而对于原始类型,你不能像一些没有友谊的
Foo
方法那样声明它们,这就是重点。这不编译:。这是关于不使用friend关键字并在类主体内声明运算符。另外,感谢您的更正G.Sliepen:)@BlackMoses将运算符移到类之外,它将编译而不会出现任何问题此不编译:。这是关于不使用friend关键字并在类主体内声明运算符。另外,感谢您的更正。G.Sliepen:)@BlackMoses将运算符移到类之外,它将顺利编译