其他分享
首页 > 其他分享> > c – 在类的函数声明中’const’的含义是什么?

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;
    }

这不完全正确,因为您可以将成员标记为可变,然后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

标签:c,declaration,const,c-faq
来源: https://codeday.me/bug/20190911/1802841.html