任何人都可以解释一下之间的区别:
const char& operator[] const
和
char& operator[]
在C ++中? 是第二个复制字符串是真的吗?为什么?
答案 0 :(得分:5)
不,第二个返回对字符串中单个字符的非常量引用,因此您实际上可以使用它来更改字符串本身(字符串对象根本不重复,但其内容可能已修改)。
std::string s = "Hell";
s[0] = 'B';
// s is "Bell" now
鉴于此示例,char& operator[]
当然可以用来访问单个字符而无需修改它,例如在std::cout<< s[0];
中。
但是,需要const
重载,因为您无法在const对象上调用非const成员函数。拿这个:
const std::string s = "Hell";
// ok, s is const, we cannot change it - but we still expect it to be accessible
std::cout << s[0];
// this, however, won't work, cannot modify a const char&
// s[0] = 'B';
通常,只有在const对象上调用时,编译器才会选择const
重载,否则它总是更喜欢使用非const方法。
答案 1 :(得分:2)
问题在于const-correctness。允许在const字符串中进行只读访问并允许在可变字符串中进行可写访问需要两种方法。
如果您想要访问const char& operator[] const
中的字符,则必须使用const std::string
访问者。 char& operator[]
访问者是修改std::string
中的字符所必需的。
答案 2 :(得分:2)
它们都返回对字符串内部成员的引用。
第一种方法被定义为const方法(最后一个const),因此承诺不会改变任何成员。为了确保你可以;通过返回的引用更改内部成员,这也是const。
const char& operator[](int i) const
// ^^^^^ this means the method will not change the state
// of the string.
//^^^^^^^^^^^ This means the object returned refers to an internal member of
// the object. To make sure you can't change the state of the string
// it is a constant reference.
这允许您从字符串中读取成员:
std::string const st("Plop is here");
char x = st[2]; // Valid to read gets 'o'
st[1] = 'o'; // Will fail to compile.
对于第二个版本,它说我们返回对内部成员的引用。既不保证对象不会被改变。所以你可以通过引用来改变字符串。
char& operator[](int i)
// ^^^^^ Returns a reference to an internal member.
std::string mu("Hi there Pan");
char y = mu[1]; // Valid to read gets 'i'
mu[9] ='M'; // Valid to modify the object.
std::cout << mu << "\n"; // Prints Hi there Man
第二个复制字符串是真的吗?为什么?
没有。因为它没有。
答案 3 :(得分:1)
第二个不需要复制(复制)字符串。它只返回对可修改字符的引用。第一个返回一个不可修改的引用,因为它必须:函数本身是const,这意味着它不能改变字符串的状态。
现在,如果你有写时复制字符串(有时采用优化),那么获取一段字符串的非const引用可能意味着复制(因为引用意味着写入)。这可能会也可能不会发生在您的特定平台上(您未指定)。
答案 4 :(得分:1)
一些基础知识:
With operator[] you can both edit value in a container/memory and read value.使用
const char& operator[] const
,您只能阅读价值。
例如。
std::string ss("text");
char a = ss[1];
使用char& operator[]
,您可以编辑该值。例如
ss[1] = 'A';