理解 char & 和 const
Understanding char & and const
我正在学习 C++,但无法理解某些概念。在下面的程序中,(1)为什么用char&
而不是char
,我觉得应该只用一个char
,因为成员函数returnstext[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;
}
1) 函数的要点是 return 对字符的引用。如果它只是 returned 值,main
中的代码将不起作用,因为它只会更改 returned 值。
2) 这两个函数的要点是允许 tb[2]
在 const 或非 const TextBook
上工作。在非常量对象上,它 return 是一个非常量引用。在 const 对象上,它 return 是一个 const 引用。
编辑:当我提到 "first" 和 "second" 时,我分别指的是非 const 和 const 版本。
在第一种情况下,在调用者希望修改字符串的情况下,有必要return 引用。通过 returning 对字符串中字符的引用,调用如下:
book[index] = 'a';
实际上会修改底层字符串本身,因为运算符会return编辑对字符串中实际字符的引用,而不是索引处字符的副本。
在第二个例子中,我们需要做两件事。我们正在创建另一个 operator[] 用于 const 对象。这个运算符不同。如您所述,方法声明后有一个 const。这意味着当 operator[] 用于 const 对象时,将调用此运算符而不是非常量版本。
const 版本 return 是一个 const 引用,如果 book
是 const,这使得这样的代码不可能:
book[index] = 'a';
如果 book
是常量,这将调用第二个 operator[]
并且 return 是常量引用。由于无法更改 const 引用,我们基本上通过使用 operator[]
阻止了对 const 书籍的修改
我正在学习 C++,但无法理解某些概念。在下面的程序中,(1)为什么用char&
而不是char
,我觉得应该只用一个char
,因为成员函数returnstext[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;
}
1) 函数的要点是 return 对字符的引用。如果它只是 returned 值,main
中的代码将不起作用,因为它只会更改 returned 值。
2) 这两个函数的要点是允许 tb[2]
在 const 或非 const TextBook
上工作。在非常量对象上,它 return 是一个非常量引用。在 const 对象上,它 return 是一个 const 引用。
编辑:当我提到 "first" 和 "second" 时,我分别指的是非 const 和 const 版本。
在第一种情况下,在调用者希望修改字符串的情况下,有必要return 引用。通过 returning 对字符串中字符的引用,调用如下:
book[index] = 'a';
实际上会修改底层字符串本身,因为运算符会return编辑对字符串中实际字符的引用,而不是索引处字符的副本。
在第二个例子中,我们需要做两件事。我们正在创建另一个 operator[] 用于 const 对象。这个运算符不同。如您所述,方法声明后有一个 const。这意味着当 operator[] 用于 const 对象时,将调用此运算符而不是非常量版本。
const 版本 return 是一个 const 引用,如果 book
是 const,这使得这样的代码不可能:
book[index] = 'a';
如果 book
是常量,这将调用第二个 operator[]
并且 return 是常量引用。由于无法更改 const 引用,我们基本上通过使用 operator[]