const成员函数

const成员函数在函数后面加一个const

就像这样

class Test
{
private:

public:
        const int a;
        const int b;
        int Add() const;

};

int Test::Add() const
{
        this->a++;

}

这样操作编译器会报错

Untitled-1.cpp: In member function ‘int Test::Add() const’:
Untitled-1.cpp:29:17: error: increment of member ‘Test::a’ in read-only object
         this->a ++;

他说在这个函数里面 this->a 这个变量是只读的

那我们读取一下

class Test
{
private:

public:
        const int a;
        const int b;
        int Add() const;

};

int Test::Add() const
{
        cout<<this->a<<endl;
}

没有报错,通过了编译。

所以印证了这个结论:
有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数,对数据成员则是可读可写的

所以我们一般在名为get的函数后面加一个cosnt 表示这个函数不改变类的成员变量

要注意一下在函数的声明和定义都要加cosnt

cosnt 对象

class Test
{
private:

public:
        int a;
        int b;
        int GetA() const;
        int GetB();
        Test(int a,int b);
};

int Test::GetA() const
{
        cout<<this->a<<endl;
        return a;
}

int Test::GetB()
{
        cout<<this->b<<endl;
        return b;
}

Test::Test(int a,int b)
{
        this->a = a;
        this->b = b;
}

int main(int argc, char const *argv[])
{
        const Test test1(1,1);
        test1.GetA();
        test1.GetB();

        Test test2(1,1);
        test2.GetA();
        test2.GetB();
}

看一下这个例子

我在类 Test 里面定义了两个函数:

一个是用const修饰的成员函数 GetA

一个是普通的成员函数 GetB

在主函数中也用Test定义了两个对象

const对象 test1 和 普通对象test2

上面函数运行之后会报错,错误提示如下:

Untitled-1.cpp: In function ‘int main(int, const char**)’:
Untitled-1.cpp:50:20: error: passing ‘const Test’ asthis’ argument discards qualifiers [-fpermissive]
         test1.GetB();

也就是说他不让我们在 test1 这个cosnt对象下使用 普通成员函数,当我们把这个调用注释掉之后,程序恢复正常

所以印证结论:

一旦对象被定义为const 对象之后,那么他就只能访问const成员

------------恢复内容结束------------

原文地址:https://www.cnblogs.com/qifeng1024/p/12658611.html