c++函数中的Const赋值
Assignment in Const C++ functions
我有一个作业,我必须写一个简单的类。该类必须保存字符串数组,并包含'+'操作符的重载,该操作符将两个数组的元素组合成一个新数组并返回该数组。
另外,这个函数必须是'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;
}
加法操作符应该返回一个新对象,而不是对其操作数之一的引用。对于A+B
,修改A
或B
,或返回对其中一个的引用是没有任何意义的。
考虑到这一点,很容易看出操作符如何可以是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;
}
+操作符不应该返回对对象的引用,而应该返回一个新对象。不要混淆+()
和+=()
运算符。后者将操作应用于表达式的左值,而前者返回一个新对象。
你应该返回:
FirstClass FirstClass::operator+(const FirstClass& add) const
假设您可以理解为什么const
需求有意义。没有它,您将被允许修改隐式this
对象的任何变量,这是不允许的。编译错误恰恰是在告诉你:"看,你正在尝试修改大小,但你应该返回一个新对象,所以操作数不能被修改"。
相关文章:
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- 为什么我需要三个嵌套的大括号来调用赋值运算符,将const引用到二维数组
- const变量是否可以在具有默认值的参数中赋值(作为可选参数)
- 返回 T 引用的 Const 函子禁止赋值
- 如何重载 const 对象的 [],以便值赋值不会导致编译错误
- 使用 const ref 参数进行自赋值的行为
- 在没有初始化列表的情况下,在c++的headerfile中为const int赋值
- C++ 错误:无法在赋值中将'const std::basic_string<char>'转换为'int'
- 交换与使用std::map[]运算符赋值(const问题)
- 具有const成员的类的赋值
- 赋值运算符重载 -- 错误 C2440:'==':无法从 'A<T> *' 转换为 'A<T> *const '
- 复制 ctor 和复制赋值运算符 const 关键字位置
- 当我在C++中将临时int赋值给const引用时会发生什么
- 为什么具有const成员的结构是可赋值的
- QString到std::string到const char*的转换在赋值中不起作用
- 将const int赋值给指向int的const指针是非法的
- 如果右手边包含字符串文字的串联,则C++const std::字符串赋值错误
- c++函数中的Const赋值
- 将const赋值给constexpr变量