【问题标题】:Understanding char & and const理解 char & 和 const
【发布时间】:2015-07-17 20:33:20
【问题描述】:

我正在学习 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;
}

【问题讨论】:

  • test[position] char的引用(或const char,取决于你的意思)。

标签: c++ char constants


【解决方案1】:

编辑:当我提到“第一”和“第二”时,我分别指的是非 const 和 const 版本。

在第一种情况下,如果调用者希望修改字符串,则必须返回一个引用。通过返回对字符串中字符的引用,调用如下:

book[index] = 'a';

实际上会修改底层字符串本身,因为运算符会返回对字符串中实际字符的引用,而不是索引处字符的副本。

在第二个例子中,我们需要做两件事。我们正在创建另一个 operator[] 用于 const 对象。这个运算符不一样。如您所述,方法声明后面有一个 const 。这意味着当在 const 对象上使用 operator[] 时,将调用此运算符而不是非常量版本。

const 版本返回一个 const 引用,如果book 是 const,这样的代码就不可能了:

book[index] = 'a';

如果 book 是 const,这将调用第二个 operator[] 并返回一个 const 引用。由于无法更改 const 引用,因此我们通过使用 operator[] 从本质上阻止了对 const book 的修改

【讨论】:

  • 谢谢。在 const char& operator[](std::size_t position) const {} 中,我可以把它写成 const char& operator[](std::size_t position) {} 吗? (没有第二个常量?)
  • @daydayup 你不能这样做,因为那样你将有两个非常量运算符。编译器将不知道在您的非常量对象上使用哪个运算符。您需要在运算符末尾添加const。它告诉编译器这是应该用于const 对象的运算符。这确保为 const 对象(不可修改)返回一个 const 引用,为非 const 对象(可修改)返回一个非常量引用。这样,我们可以改变一个非常量对象的字符串,而我们不能改变一个常量对象的字符串。
【解决方案2】:

1) 函数的重点是返回一个字符的引用。如果它只是返回值,main 中的代码将不起作用,因为它只会更改返回值。

2) 这两个函数的重点是允许tb[2] 在常量或非常量TextBook 上工作。在非常量对象上,它返回非常量引用。在 const 对象上,它返回一个 const 引用。

【讨论】:

  • 谢谢。在 const char& operator[](std::size_t position) const {} 中,我可以写成 const char& operator[](std::size_t position) {} 吗? (没有第二个常量?)
  • @daydayup 有什么意义?如果它不是一个 const 成员函数,它做了什么其他函数没有?
猜你喜欢
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 2013-09-27
  • 2013-04-23
  • 1970-01-01
  • 2018-11-05
相关资源
最近更新 更多