2017-06-01 80 views
2
#include<iostream> 
using namespace std; 

class test 
{ 
    int i; 
    string s; 

    public: 
    test(){} 

    test(int a,string b) 
    { 
     i=a; 
     s=b; 
    } 

    void operator = (test &temp) 
    { 
     cout<<"In assignment operator"<<endl; 
     i=temp.i; 
     s=temp.s; 
    } 

    test operator + (test &temp) 
    { 
     test newobj; 
     newobj.i=i+temp.i; 
     newobj.s=s+" "+temp.s; 
     return newobj; 
    } 
}; 

main() 
{ 
    test t1(5,"ABC"); 
    test t2; 
    t2=t1; 
    test t3; 
    t3=t1+t2; 
} 

問題:t3=t1+t2給了我一個錯誤。我想重載=和+運算符並按照上圖所示使用它們。我錯在哪裏?我想明確定義一個賦值運算符重載,即使編譯器提供了一個。超載分配和加運算符

錯誤:從類型 'test' 的t3=t1+t2;

初始化的 'void test::operator=(test&)' void operator = (test &temp)

+0

這兩個運營商應該把他們的參數作爲'const的測試&'。 –

+0

參數需要是'const temp&';因爲't1 + t2'是臨時的,不能通過非const。 –

+0

如果有人能夠在參數中解釋const的使用,我們將非常感激。據我所知,const只是表示接收的對象的數據成員不能被改變。我可能錯了。請幫忙。 –

回答

1

t1+t2參數1右值的類型的非const引用 '測試&' 無效初始化返回一個臨時的test,不能綁定到引用非const(即test &),這就是爲什麼t3=t1+t2;失敗。另一方面,臨時可以被綁定到引用const(即const test&)。因此,您可以將參數類型更改爲const test&,例如

void operator = (const test &temp) 
{ 
    cout<<"In assignment operator"<<endl; 
    i=temp.i; 
    s=temp.s; 
} 

BTW1:最好是用operator+做同樣的事情。

BTW2:的operator=常規簽名(並實施)爲:

test& operator= (const test& temp) 
{ 
    cout<<"In assignment operator"<<endl; 
    i = temp.i; 
    s = temp.s; 
    return *this; 
} 
+0

謝謝。但不明白你對const的解釋。通過接收測試對象爲const,上述代碼如何工作得很好?在賦值運算符重載函數中,爲什麼當我們僅僅將第二個對象的值賦給當前對象時,我們需要返回當前對象。假設t2 = t1,這裏t2對象將調用=運算符並將接收t1對象的引用。那麼我們只是將t1的值賦值給t2。爲什麼我們需要返回*這個? (即參考對象t2) –

+0

@DigeshPatel因爲臨時不能綁定到'test&',而是'const test&'。例如'test&t = test {};'會失敗,但'const test&t = test {};'很好。 – songyuanyao

+0

@DigeshPatel對於你的第二個問題,可以像內置類型一樣鏈接操作符。例如't1 = t2 = t3;'。 – songyuanyao