运算符重载中的成员二元运算符和非成员二元运算符 在尝试学习运算符重载时,我从C++入门中阅读下面的语句。坦率地说,我不太明白这些声明想要传达什么信息。示例包括定义成员二进制运算符和非成员二进制运算符。使用它们有什么区别吗
通常,我们将算术运算符和关系运算符定义为非成员函数,并将赋值运算符定义为成员: 加法和复合赋值都是二进制运算符,但这些函数定义了不同数量的参数。产生差异的原因是此指针的错误运算符重载中的成员二元运算符和非成员二元运算符 在尝试学习运算符重载时,我从C++入门中阅读下面的语句。坦率地说,我不太明白这些声明想要传达什么信息。示例包括定义成员二进制运算符和非成员二进制运算符。使用它们有什么区别吗,c++,C++,通常,我们将算术运算符和关系运算符定义为非成员函数,并将赋值运算符定义为成员: 加法和复合赋值都是二进制运算符,但这些函数定义了不同数量的参数。产生差异的原因是此指针的错误 是的,实际使用中存在差异。特别是,当您将运算符作为非成员函数重载时,可以对任一操作数(或两个操作数)应用转换。使用成员函数重载二进制运算符时,转换只能应用于正确的操作数 这可能会导致一些奇怪的事情。例如,考虑写一个“BigNIM”包,你想过载运算符+来处理签名。如果将其作为成员函数重载,则会出现如下奇怪情况: int x =
是的,实际使用中存在差异。特别是,当您将运算符作为非成员函数重载时,可以对任一操作数(或两个操作数)应用转换。使用成员函数重载二进制运算符时,转换只能应用于正确的操作数 这可能会导致一些奇怪的事情。例如,考虑写一个“BigNIM”包,你想过载<代码>运算符+<代码>来处理签名。如果将其作为成员函数重载,则会出现如下奇怪情况:
int x = 2;
bignum y = 3;
bignum z;
z = y + x; // works fine.
z = x + y; // doesn't work: x isn't a bignum, and can/won't be converted to one
相反,如果使用非成员函数重载operator+
,这两个操作都会起作用(假设您有一个构造函数从int创建bignum,这几乎是您肯定想要的)
一些运算符(特别是赋值运算符,如=
、+=
、-=
等)是特殊的。转换会创建一个临时对象,并且指定给临时对象1)是不允许的,2)无论如何都没有意义或完成不了多少工作。因此,重载赋值运算符时,始终使用成员函数
int x = 2;
bignum y = 3;
bignum z;
z = y + x; // works fine.
z = x + y; // doesn't work: x isn't a bignum, and can/won't be converted to one