C ++方法声明中最后一个“const”的含义?

const在这些声明中的含义是什么? const让我困惑。

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

const关键字添加到方法时, this指针本质上将成为指向const对象的指针,因此不能更改任何成员数据。 (除非你使用mutable ,稍后更多)。

const关键字是函数签名的一部分,这意味着您可以实现两个类似的方法,一个是在对象为const时调用的,另一个不是。

#include <iostream>

class MyClass
{
private:
    int counter;
public:
    void Foo()
    { 
        std::cout << "Foo" << std::endl;    
    }

    void Foo() const
    {
        std::cout << "Foo const" << std::endl;
    }

};

int main()
{
    MyClass cc;
    const MyClass& ccc = cc;
    cc.Foo();
    ccc.Foo();
}

这将输出

Foo
Foo const

在非const方法中,您可以更改实例成员,这是您在const版本中无法做到的。 如果将上例中的方法声明更改为下面的代码,则会出现一些错误。

    void Foo()
    {
        counter++; //this works
        std::cout << "Foo" << std::endl;    
    }

    void Foo() const
    {
        counter++; //this will not compile
        std::cout << "Foo const" << std::endl;
    }

这并不完全正确,因为您可以将成员标记为mutable ,然后可以使用const方法更改它。 它主要用于内部计数器和东西。 解决方案是下面的代码。

#include <iostream>

class MyClass
{
private:
    mutable int counter;
public:

    MyClass() : counter(0) {}

    void Foo()
    {
        counter++;
        std::cout << "Foo" << std::endl;    
    }

    void Foo() const
    {
        counter++;
        std::cout << "Foo const" << std::endl;
    }

    int GetInvocations() const
    {
        return counter;
    }
};

int main(void)
{
    MyClass cc;
    const MyClass& ccc = cc;
    cc.Foo();
    ccc.Foo();
    std::cout << "The MyClass instance has been invoked " << ccc.GetInvocations() << " times" << endl;
}

这将输出

Foo
Foo const
The MyClass instance has been invoked 2 times

const意味着该方法承诺不会改变该类的任何成员。 即使对象本身被标记为const ,您也可以执行已标记的对象成员:

const foobar fb;
fb.foo();

将是合法的。

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


const限定符意味着可以在任何foobar值上调用这些方法。 当你考虑在一个const对象上调用一个非const方法时,会有所不同。 考虑一下你的foobar类型是否有以下额外的方法声明:

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

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

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);
链接地址: http://www.djcxy.com/p/1053.html

上一篇: Meaning of "const" last in a C++ method declaration?

下一篇: What does the C++ standard state the size of int, long type to be?