2013-04-25 86 views
0

我有一個賦值,我必須編寫一個簡單的類。該類必須包含一個字符串數組,並且包含'+'運算符的重載,該運算符將兩個數組的元素組合爲一個新數組並將其返回。Const C++函數中的賦值

此外,這個函數必須是'const',這是我遇到問題的地方。當試圖更改類「大小」屬性和它所持有的數組時,我收到錯誤。嘗試返回對象時也會出錯。我明白前兩個錯誤的原因是因爲我已經聲明瞭函數'const',但我的問題是,在const方法內重新分配這些值的正確方法是什麼?

不要扯到我太壞,我剛剛開始學習C++,這些概念對我來說有點新。我試過研究這個主題,但我還沒有找到任何有用的答案。這就是說,我真的需要得到這個功能的工作,所以任何幫助將不勝感激。

這裏是類:

class FirstClass{ 

private: 
    string* sList; 
    unsigned int _size; 

public: 
    FirstClass(const unsigned int initSize = 1); 
     // copy, assignment, and destructor 
    FirstClass& operator+(const FirstClass& add)const; 
}; 





    FirstClass::FirstClass(const unsigned int initSize):_size(initSize) 
{ 
    sList = new string[initSize]; 
    return; 
} 



FirstClass& FirstClass::operator+(const FirstClass& add) 
const{ 
    if(add.sList){ 
     int prevSize = this->_size; 
     this->_size += add._size; // can't do this 
     string newList[this->_size]; 


     for(int a=0; a<prevSize; a++){ 
      newList[a] = this->sList[a]; 
     } 
     for(int b=0; b<add._size; b++){ 
      sList[b+prevSize] = add.sList[b]; 
     } 
     delete [] sList; 
     this->sList = newList; // or this 
    } 

    return *this; // or this 
} 

編輯:感謝您的快速響應,並清理我在做什麼。這是我修改的代碼。

FirstClass FirstClass::operator+(const FirstClass& add) 
const{ 
    FirstClass ma(this->_size + add._size); 
    if(add.sList){ 

     for(int a=0; a<this->_size; a++){ 
      ma.sList[a] = this->sList[a]; 
     } 
     for(int b=0; b<add._size; b++){ 
      ma.sList[b+this->_size] = add.sList[b]; 
     } 
    } 

    return ma; 
} 
+1

提示:如果我這樣做:'int a; int b; int c = a + b;'a'或'b'是否被修改? – Pubby 2013-04-25 16:49:26

回答

4

一個加法運算符應該返回一個新的對象,而不是對它的一個操作數的引用。 A+B修改AB或返回對其中之一的引用沒有任何意義。

考慮到這一點,很容易看出運算符是如何變爲const的。

FirstClass operator+(const FirstClass& rhs) const; 

你可以實現一個變異operator+=,並且在這方面實現operator+

FirstClass& operator+=(const FirstClass& rhs); 

FirstClass operator+(const FirstClass& rhs) const 
{ 
    FirstClass ret = rhs; 
    ret += *this; 
    return ret; 
} 

或作爲非會員:

FirstClass operator+(const FirstClass& lhs, const FirstClass& rhs) 
{ 
    FirstClass ret = lhs; 
    ret += rhs; 
    return ret; 
} 
+0

您的非會員版本修改lhs,這是運營商+不應該這樣做的。另外,不允許在非成員函數上使用const。 – dousin 2014-01-06 23:11:33

+0

@dousin謝謝。它的價值取決於LHS,所以第一部分不是問題。什麼是問題是它禁止返回值優化。我現在會解決這個問題。 – juanchopanza 2014-01-06 23:12:55

+0

對不起,我錯過了 – dousin 2014-01-06 23:20:38

1

+操作不應返回對一個對象的引用,而是一個新的對象。不要混淆+()+=()運營商。後者將操作應用於表達式的lval,而第一個返回新對象。

您應該返回:

FirstClass FirstClass::operator+(const FirstClass& add) const 

假設這一點,你可以理解爲什麼const要求有一個感覺。沒有它,你將被允許修改任何不允許的隱含的對象this的變量。編譯錯誤就是在那裏告訴你:「看你正在嘗試修改大小,但你應該返回一個新的對象,所以操作數不能被修改」。