在成员函数参数列表后面加上const,表示该成员函数是const成员函数。这里的const是修饰this指针的类型。
默认情况下,this的类型是指向类类型对象的常量指针,即指针本身是常量,但指针所指的对象不是常量。
在下面例子中,this的类型是conClass *const,默认情况下不能把this绑定到一个常量对象上。这样使我们不能在一个常量对象上调用普通的成员函数。
如果成员函数不改变this所指对象,应该把this声明成const conClass *const。
#include<iostream>
#include <string>
#include <vector>
using namespace std;
class ConClass{
private:
int idata;
string sdata;
public:
ConClass(int a,string b) {
idata = a;
sdata = b;
}
void print() const{ //const成员函数,只能被常量对象,常量对象的引用或指针调用
cout << idata << " " << sdata << endl;
}
void setData(int _idata, string _sdata) //要修改对象,不能为const成员函数
{
idata = _idata;
sdata = _sdata;
}
};
int main()
{
const ConClass *myConst1 = new ConClass(2, "test");
const ConClass myConst2(3, "TEST");
//myConst1->setData(0, "NULL");//错误
//myConst2.setData(0, "NULL"); //错误
myConst1->print();
return 0;
}
注意:const成员函数,只能被常量对象,常量对象的引用或指针调用。
构造函数不能被声明为const,当我们创建一个const对象时,知道构造函数完成初始化过程,对象才能真正取得其“常量”属性。
mutable关键字可以修改某个数据成员,即使在一个const成员函数内。
class ConClass{
private:
int idata;
string sdata;
mutable int mdata; //mutable关键字使得该变量在const成员函数中可以被修改
public:
ConClass(int a, string b) {
idata = a;
sdata = b;
}
void print() const{ //const成员函数,只能被常量对象,常量对象的引用或指针调用
cout << idata << " " << sdata << endl;
}
void setData(int _idata, string _sdata) //要修改对象,不能为const成员函数
{
idata = _idata;
sdata = _sdata;
}
void change(int _mdata) const{
mdata = _mdata; //可以修改
}
};
const成员函数返回类引用应该是const类型的引用。
const ConClass& print() const{ //前面的const不能少
return *this; //
}
通过区分成员函数是否是const的,可以对其进行重载
#include<iostream>
#include <string>
#include <vector>
using namespace std;
class ConClass{
private:
int idata = 0;
string sdata = "NULL";
public:
ConClass(int a, string b) {
idata = a;
sdata = b;
}
ConClass(){}
ConClass &display(std::ostream &os){
doDisplay(os);
return *this;
}
const ConClass &display(std::ostream &os) const{//后面const不能少,否则不能形成重载
doDisplay(os);
return *this;
}
private:
void doDisplay(std::ostream &os) const{
os << idata << " " << sdata << endl;
}
};
int main()
{
const ConClass myConst1;
ConClass myConst2(3, "TEST");
myConst1.display(cout); //调用const版本
myConst2.display(cout); //调用非const版本
return 0;
}
补充:const指针
const如果在*左边,表示指针指向的内容不可修改,const如果在*右边,表示指针本身不可修改。
比如const char* keyword表示指针指向的对象是const char,是不可修改的。
那么const char* const *keyword;表示的含义呢?
很简单,可以这样看(const char *) const * keyword;是一个二级指针。第二个const表示这个二级指针指向的对象是不可修改的(const char *),但是二级指针本身可以修改。
#include <iostream>
using namespace std;
int main(){
const char *const *keywords;
const char *p = "hello world!\n";
keywords = &p; //可以修改
cout << p << *keywords;
return 0;
}