Meaning of 'const' last in a function declaration of a class?

后端 未结 10 2301
无人共我
无人共我 2020-11-21 06:37

What is the meaning of const in declarations like these? The const confuses me.

class foobar
{
  public:
     operator int () const         


        
10条回答
  •  遥遥无期
    2020-11-21 07:19

    When you add the const keyword to a method the this pointer will essentially become a pointer to const object, and you cannot therefore change any member data. (Unless you use mutable, more on that later).

    The const keyword is part of the functions signature which means that you can implement two similar methods, one which is called when the object is const, and one that isn't.

    #include 
    
    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();
    }
    

    This will output

    Foo
    Foo const
    

    In the non-const method you can change the instance members, which you cannot do in the const version. If you change the method declaration in the above example to the code below you will get some errors.

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

    This is not completely true, because you can mark a member as mutable and a const method can then change it. It's mostly used for internal counters and stuff. The solution for that would be the below code.

    #include 
    
    class MyClass
    {
    private:
        mutable int counter;
    public:
    
        MyClass() : counter(0) {}
    
        void Foo()
        {
            counter++;
            std::cout << "Foo" << std::endl;    
        }
    
        void Foo() const
        {
            counter++;    // This works because counter is `mutable`
            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 << "Foo has been invoked " << ccc.GetInvocations() << " times" << std::endl;
    }
    

    which would output

    Foo
    Foo const
    Foo has been invoked 2 times
    

提交回复
热议问题