我正在学习C ++并且无法理解一些概念。在以下程序中,(1)为什么使用char&
而不是char
,我认为它应该只使用char
,因为成员函数返回text[position]
这个是char
类型,而不是引用。 (2)在const char& operator[](std::size_t position) const
中,为什么第二个const
是必要的?我尝试删除它并仅保留第一个const
,但它报告错误。谢谢。
#include<iostream>
#include<string>
class TextBook{
public:
TextBook(std::string s)
{
text.assign(s);
}
const char& operator[](std::size_t position) const {
return text[position];
}
char& operator[](std::size_t position){
return text[position];
}
private:
std::string text;
};
int main()
{
const TextBook ctb("Hello");
std::cout << ctb[0] << std::endl;
TextBook tb("Morning");
tb[2]='M';
std::cout << tb[2] << std::endl;
}
答案 0 :(得分:1)
1)该函数的要点是返回对字符的引用。如果它只是返回了值,则main
中的代码将无法正常工作,因为它只会更改返回的值。
2)这两个函数的要点是允许tb[2]
处理const或非const TextBook
。在非const对象上,它返回一个非const引用。在const对象上,它返回一个const引用。
答案 1 :(得分:1)
编辑:当我提及&#34;首先&#34;和&#34;秒&#34;,我分别指的是非const和const版本。
在第一种情况下,在调用者希望修改字符串的情况下返回引用是必要的。通过返回对字符串中字符的引用,可以这样调用:
book[index] = 'a';
实际上会修改底层字符串本身,因为操作符将返回对字符串中实际字符的引用,而不是索引处字符的副本。
在第二个例子中,我们需要做两件事。我们正在创建另一个与const对象一起使用的operator []。这个运营商是不同的。如您所述,方法声明后面有一个const。这意味着当在const对象上使用operator []时,将调用此运算符而不是非const版本。
const版本返回一个const引用,如果book
是const,那么这样的代码就不可能了:
book[index] = 'a';
如果book
是const,则会调用第二个operator[]
并返回一个const引用。由于const引用无法更改,因此我们通过使用operator[]