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’ as ‘this’ argument discards qualifiers [-fpermissive] test1.GetB();
也就是说他不让我们在 test1 这个cosnt对象下使用 普通成员函数,当我们把这个调用注释掉之后,程序恢复正常
所以印证结论:
一旦对象被定义为const 对象之后,那么他就只能访问const成员
------------恢复内容结束------------