2013-04-25 85 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的变量。编译错误就是在那里告诉你:“看你正在尝试修改大小,但你应该返回一个新的对象,所以操作数不能被修改”。