C++:运算符重载问题?

C++: Operator Overloading Problems?

我的朋友有一些关于运算符重载的代码。代码如下:

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",然后 return 一个新对象。是否有意义?我如何使用这个新运算符“+”,谁能举个例子?

原型Bar Foo ::operator +()表示一元加运算符。可以这样使用:

Foo f;
Bar b = +f; // "+f" is the unary plus operator

I don't understand the function 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? and What does the unary plus operator do?

在您的代码中,您可以这样调用运算符:

Foo f;
+f;

关于您显示的代码的另一个奇怪之处是运算符 returns Bar 而不是人们期望的 Foo (尽管同样,名称如 "Foo" 和 "Bar",人们无法真正确定代码的假定意图)。

运算符也是private,也就是说只能在Foo自己的函数或者朋友里面使用。这不可能是对的。

int value=  b1->num +b2->num;

这是未定义的行为,因为您试图通过未初始化的指针访问成员[*]。或者您没有向我们展示 b1b2 被初始化 and/or 分配的代码。

Bar * b = new Bar(value);
return (*b);

这会造成内存泄漏,因为 new 动态分配的内存中的 Bar 对象被复制并且永远不会被销毁,作为唯一指向它的指针 (b) 丢失了。


也许您的朋友想创造将 BarFoo 相加的可能性。如果是这样的话,那么很多事情都出了问题。该函数有错误的接口 错误的实现。

请转至 http://en.cppreference.com/w/cpp/language/operators 并阅读有关二进制算术运算符的部分,了解如何正确完成此操作。

或者暂时忘记运算符重载。似乎缺少有关该语言的一些更基本的知识(例如 nullptr / 指针初始化 / 一般指针)。


[*] 不是 nullptr,因为这个答案的前一个版本说

通常运算符重载意味着您​​正在为现有运算符赋予新定义。有一些例外和规则需要遵守(google)。

基本语法是

 <return type> operator "symbol" (parameters)

例如:假设您有一个像这样的 class 复合体

class complex{
int real,img;
}

您需要重载运算符 +,使其能够像这样执行两个复数的加法

public:
void operator+(complex ob)
{cout<<real+ob.real<<" + i "<<img+ob.img; }

规则: 运算符必须与这样的 class 对象一起使用

complex a,b;
a+b;

注意: 这里 a 是调用对象( ((a.)+b)) 这由编译器处理)。 b 与 a 没有任何关系,除了它们具有相同的数据类型这一事实。所以 b 作为参数传递(所有二元运算符都必须有一个参数)。

对于您的示例,您已经重载了一元 + 运算符。它与二进制重载基本相同,但不能传递参数。 希望你理解运算符重载的概念