在这样的声明中const的含义是什么?这个常数使我困惑。

class foobar
{
  public:
     operator int () const;
     const char* foo() const;
};

当前回答

const限定符意味着可以对foobar的任何值调用这些方法。当您考虑对常量对象调用非常量方法时,就会出现不同。考虑您的foobar类型是否具有以下额外的方法声明:

class foobar {
  ...
  const char* bar();
}

方法bar()是非常量的,只能从非常量值访问。

void func1(const foobar& fb1, foobar& fb2) {
  const char* v1 = fb1.bar();  // won't compile
  const char* v2 = fb2.bar();  // works
}

const背后的思想是标记不会改变类内部状态的方法。这是一个强大的概念,但实际上在C++中无法实现。与其说是保证,不如说是承诺。还有一个经常破碎且容易破碎的。

foobar& fbNonConst = const_cast<foobar&>(fb1);

其他回答

我想补充一点。

也可以将其设置为常量和常量&&

So,

struct s{
    void val1() const {
     // *this is const here. Hence this function cannot modify any member of *this
    }
    void val2() const & {
    // *this is const& here
    }
    void val3() const && {
    // The object calling this function should be const rvalue only.
    }
    void val4() && {
    // The object calling this function should be rvalue reference only.
    }

};

int main(){
  s a;
  a.val1(); //okay
  a.val2(); //okay
  // a.val3() not okay, a is not rvalue will be okay if called like
  std::move(a).val3(); // okay, move makes it a rvalue
}

请随意改进答案。我不是专家

const限定符意味着可以对foobar的任何值调用这些方法。当您考虑对常量对象调用非常量方法时,就会出现不同。考虑您的foobar类型是否具有以下额外的方法声明:

class foobar {
  ...
  const char* bar();
}

方法bar()是非常量的,只能从非常量值访问。

void func1(const foobar& fb1, foobar& fb2) {
  const char* v1 = fb1.bar();  // won't compile
  const char* v2 = fb2.bar();  // works
}

const背后的思想是标记不会改变类内部状态的方法。这是一个强大的概念,但实际上在C++中无法实现。与其说是保证,不如说是承诺。还有一个经常破碎且容易破碎的。

foobar& fbNonConst = const_cast<foobar&>(fb1);

const表示该方法承诺不会更改类的任何成员。即使对象本身被标记为const,也可以执行如此标记的对象成员:

const foobar fb;
fb.foo();

将是合法的。

看看C++中“const”的用法有多少?了解更多信息。

与函数声明一起使用的const关键字指定它是一个const成员函数,它将无法更改对象的数据成员。

布莱尔的答案是正确的。

但是请注意,有一个可变的限定符可以添加到类的数据成员中。任何标记的成员都可以在const方法中修改,而不违反const约定。

如果您希望对象记住某个特定方法被调用的次数,同时不影响该方法的“逻辑”常量,则可能需要使用这个(例如)。