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

时间:2015-10-06 15:39:19

标签: c++ operator-overloading

我的朋友们有一些关于运营商重载的代码。代码如下:

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”,然后返回一个新对象。是否有意义?如何使用这个新的运算符“+”,任何人都可以举个例子?

3 个答案:

答案 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;

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

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

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

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

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

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

[*] 而不是nullptr s作为此答案的先前版本说