在成员函数参数列表后面加上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;
}
本文详细解释了C++中成员函数的const修饰符的使用,包括const成员函数的概念、作用以及如何在不同场景下应用。通过实例演示了const成员函数的限制条件、构造函数与const的关系,以及mutable关键字的使用。此外,还讨论了const成员函数返回类引用的要求,并展示了如何通过区分成员函数是否为const进行重载。最后,介绍了const指针的概念及其在不同位置的含义。

449

被折叠的 条评论
为什么被折叠?



