操作符重载问题

C++: Operator Overloading Problems?

本文关键字:问题 重载 操作符      更新时间:2023-10-16

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

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"answers"b2"。Num",然后返回一个新对象。这有意义吗?我如何使用这个新的运算符"+",有人可以给一个例子吗?

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

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

操作符重载通常意味着给现有的操作符赋予新的定义。有一些例外和规则需要遵循(谷歌它)。

基本语法是
 <return type> operator "symbol" (parameters)
例如:假设你有一个像这样的复杂类
class complex{
int real,img;
}

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

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

规则:操作符必须与类对象一起使用,如

complex a,b;
a+b;

注意:这里a是调用对象(((a.)+b))这是由编译器处理的)。除了B和a具有相同的数据类型外,它们没有任何联系。因此b作为形参传递(所有二进制操作符都必须有实参)。

在你的例子中,你重载了一元+运算符。它基本上和二进制重载是一样的,但是你不能传递参数。希望您理解操作符重载的概念

我不理解Bar operator +() "的功能

理应如此。它没有多大意义(当然,对于像"Foo"answers"Bar"这样的示例名称,很少有东西有意义)。它声明了一个一元加运算符

这已经是该语言的一个外来特征了。下面是一个例子:

#include <iostream>
int main()
{
    int i = 5;
    std::cout << +i << "n";
}

不出所料,这个程序将打印5。但是有一些用例。参见char数组上的一元加号操作符的目的是什么?和一元加号操作符做什么?

在您的代码中,您可以这样调用操作符:
Foo f;
+f;

关于您所显示的代码的另一个奇怪的事情是,操作符返回Bar而不是像人们期望的那样返回Foo(尽管,再次使用像"Foo"answers"Bar"这样的名称,人们无法真正确定代码的假定意图)。

操作符也是private,这意味着它只能在Foo自己的函数或友元中使用。这不可能是对的。

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

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

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

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


也许你的朋友想创建添加BarFoo在一起的可能性。如果是这样的话,那么很多事情都出了问题。函数有错误的接口错误的实现。

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

或者暂时忘记操作符重载。关于语言的一些更基本的知识(例如nullptr/指针初始化/指针一般)似乎缺失了。


[*]not nullptr s