【问题标题】:Difference between bitwise constness and member function constness [duplicate]按位常量和成员函数常量之间的区别[重复]
【发布时间】:2024-04-14 06:10:02
【问题描述】:

我正在阅读这本书,名为“Effective C++ Third Edition 55 Specific Ways to Improvement”,在阅读时我遇到了 constness 的主题,我不明白重载和重载之间的区别const operator[] 具有 bitwisemember function constness,

const char operator[](size_t t) 
    const{
         return text[t];
    }

,以及重载的非常量 [],它不必对常量做任何事情

char operator[](size_t t) 
    {
         return text[t];
    }

我尝试过使用和不使用 const 和 non-const 重载[] 进行一些操作,但仍然没有看到区别,这仅用于使代码可读吗?或者如果有什么不同,那是什么?

这是我的字符串类

class String
{
    int len = 0;
    char text[];
    public : 

    String( const char c[])   
    {
        strcpy(text , c); 
        len  = strlen(text);
    }
    int length();
    const char operator[](size_t t) 
    const{
         return text[t];
    }
     
    char operator[](size_t t) 
    {
         return text[t];
    }
};

【问题讨论】:

  • char text[]; 不是有效成员。 (那本书不是初学者的书;它“旨在成为 C++ 程序员应该阅读的最好的第二本书”。)
  • 显示您尝试过的操作。如果他们没有在const 实例上完成,那一点也不重要。但是如果你忽略了const 重载并尝试在const String 上调用operator[],你会发现它无法编译。然后,一旦添加了它,const 对象的访问器应该/必须返回包含数据的const 版本是合乎逻辑的。这是基本的初学者级别的东西,不值得提问。如果您还不知道某物是什么,那么请不要使用它。但是您可能很快就会发现const 的许多要点是什么(基本和良好实践)。
  • 这本书实际上并不包含(无用的)const char operator[]。它包含一个const char& operator[]。如果你不明白为什么一个const 没有用而另一个没有,或者为什么有&,你可能需要阅读另一本C++ 书籍。
  • 如果你想要一本好书:The Definitive C++ Book Guide and List

标签: c++ constants bit-manipulation overloading


【解决方案1】:

可以在 const 对象上调用 const 方法,因为它们不会修改对象:

例如,如果你有 Foo 类:

class Foo {
  ...
  const methodA();
  methodB();
  ...
};

并像这样使用它:

Foo objectA;
const Foo objectB;

您可以在 objectA 上调用这两种方法,但只能在 objectB 上调用 methodA():

objectB.methodA();
objectB.methodB(); // <-- invalid

同样适用于运营商。

【讨论】:

  • 修改类内部变量。例如,如果这是类:class Foo { int someVar; public: void SetVar(int newVar) { someVar = newVar; }; } SetVar can not be declared const!
最近更新 更多