我的朋友们有一些关于运营商重载的代码。代码如下:
class Bar
{
public:
int num;
Bar(int n){
num = n;
}
};
class FooPa
{
// Consider it empty
};
class Foo : public FooPa
{
Bar *b1, *b2;
Bar operator + ( )// **I don't understand this function, how can I use it?**
{
int value= b1->num +b2->num;
Bar * b = new Bar(value);
return (*b);
}
};
我不懂功能“Bar operator +()”。他想数学上添加“b1.num”和“b2.num”,然后返回一个新对象。是否有意义?如何使用这个新的运算符“+”,任何人都可以举个例子?
答案 0 :(得分:3)
原型Bar Foo ::operator +()
表示一元加运算符。它可以像这样使用:
Foo f;
Bar b = +f; // "+f" is the unary plus operator
答案 1 :(得分:3)
通常,运算符重载意味着您要为现有运算符赋予新的定义。有一些例外和规则需要遵循(谷歌)。
基本语法是
<return type> operator "symbol" (parameters)
例如:假设您有类似这样的类复杂
class complex{
int real,img;
}
你需要以这样的方式重载operator +,它可以执行两个这样的复数的加法
public:
void operator+(complex ob)
{cout<<real+ob.real<<" + i "<<img+ob.img; }
规则: 运算符必须与此类
类对象一起使用complex a,b;
a+b;
注意: 这里a是调用对象(((a。)+ b))这由编译器负责)。 b除了它们具有相同的数据类型之外没有任何联系。所以b作为参数传递(所有二元运算符都必须有参数)。
来到你的例子,你已经超载了一元+运算符。它与二进制重载基本相同,但是你不能传递参数。 希望您理解运算符重载的概念
答案 2 :(得分:2)
我不理解函数
Bar operator +()
“
理所当然。它没有多大意义(当然,使用像“Foo”和“Bar”这样的示例名称,很少有事情)。它声明了一元加运算符。
这已经是该语言的一个异国情调的特征。这是一个例子:
#include <iostream>
int main()
{
int i = 5;
std::cout << +i << "\n";
}
不出所料,该程序将打印5
。但是,有一些用例。请参阅What is the purpose of unary plus operator on char array?和What does the unary plus operator do?。
在您的代码中,您可以像这样调用运算符:
Foo f;
+f;
您展示的代码的另一个奇怪之处在于操作符返回Bar
而不是Foo
,正如人们所期望的那样(尽管如此,名称如“Foo”和“Bar”,一个不能真正确定代码的假设意图。)
运算符也是private
,这意味着它只能在Foo
自己的函数或朋友中使用。这几乎是不对的。
int value= b1->num +b2->num;
这是未定义的行为,因为您尝试通过未初始化的指针 [*] 访问成员。或者,您没有向我们展示初始化和/或分配b1
和b2
的代码。
Bar * b = new Bar(value); return (*b);
这会造成内存泄漏,因为生成在Bar
动态分配的内存中的new
对象被复制并且永远不会被销毁,作为唯一指向它的指针({{1失去了。
也许您的朋友想要创建将b
和Bar
加在一起的可能性。如果是这样,那么很多事情都出了问题。该函数具有错误的接口和错误的实现。
请转到http://en.cppreference.com/w/cpp/language/operators并阅读有关二进制算术运算符的部分,了解如何正确完成此操作。
或者暂时忘记运算符重载。关于语言的一些更基本的知识(例如Foo
/指针初始化/指针一般)似乎缺失。
[*] 而不是nullptr
s作为此答案的先前版本说