C++; 在C++中,如果你有一个类FoO,并且你希望Foo的用户能够写: Foo x; x += 3; Foo x; int y = 3; y += x;
,您只需创建Foo的一个成员函数,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&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将运算符移到类之外,它将顺利编译