2015-10-06 45 views
-3

我的朋友有一些關於運算符重載的代碼。代碼如下:C++:運算符重載問題?

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」,然後返回一個新的對象。是否有意義?我如何使用這個新的運算符「+」,任何人都可以舉個例子?

+1

運算符+的原型是錯誤的。你不能使用它。這並沒有提到內存泄漏和一切。 – SergeyA

+0

缺乏經驗的程序員的投票問題是SO上的新時尚。 :P –

+0

@SergeyA它是一個+一元運算符重載,除了內存泄漏外,它是很好的。 –

回答

2

我不明白的功能Bar operator +()富「

理所當然的它沒有多大意義(當然,與像例如名字。」 「和‘酒吧’,幾件事情做的),它聲明一個一元加運算

這已經是語言的一個相當奇特的功能,下面是一個例子:。

#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動態分配的內存被複制,絕不會被破壞,作爲一個和僅指向它的指針(b)是丟失。


也許你的朋友想要創造增加BarFoo在一起的可能性。如果是這樣,那麼很多事情都會出錯。該函數具有錯誤的接口錯誤的實現。

請轉到http://en.cppreference.com/w/cpp/language/operators並閱讀有關二進制算術運算符的部分,以瞭解它是如何正確完成的。

或者現在就忘記操作符重載。關於該語言的一些基礎知識(例如nullptr /指針初始化/一般指針)似乎缺失。


[*]nullptr S作爲以前的版本這個答案說

3

原型Bar Foo ::operator +()意味着一元加操作符。它可以像這樣使用:

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

通常運算符重載意味着你是給新定義到現有的運營商。有一些例外和規則需要遵循(谷歌它)。

的基本語法

<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除了它們具有相同數據類型這一事實之外沒有任何聯繫。所以b作爲參數傳遞(所有的二元運算符都必須有一個參數)。

來到你的例子你重載了一元+運算符。它與二進制重載基本相同,但不能傳遞參數。 希望你理解運算符超載的概念