在C++中,非静态成员函数的函数名后面可以加上const关键字(静态函数和非成员函数都不能加,加上后编译会出错),加上后该函数隐式传入的this指针将const指针。
例如执行下面的代码:
#include<iostream>
#include<string>
#include<typeinfo>
using namespace std;
class Sale_Date
{
public :
void isbn()
{
cout << typeid(this).name() << endl;
}
};
int main()
{
Sale_Date a;
a.isbn();
return 0;
}
此时输出的是:
给isbn函数加上const关键字后:
#include<iostream>
#include<string>
#include<typeinfo>
using namespace std;
class Sale_Date
{
public :
void isbn()const
{
cout << typeid(this).name() << endl;
}
};
int main()
{
Sale_Date a;
a.isbn();
return 0;
}
输出为:
既然加上const关键字后this指针变成了const指针,那么在该函数内部就不能再修改该类的成员变量了,但是有一个例外,就是在需要改变的成员变量前面加上mutable关键字后就可以在加了const限定的成员函数内部修改该成员变量的值了,也就是说,在上面的例子中,要是我想在加了const的isbn函数里面修改bookNo的值,那么我只需要在string bookNo前面加上mutable就可以了。
那么 ,在类成员函数后面加上const限定后,除了上面说到了作用,还有其他的作用吗? 肯定有啊,不然我写这句话干嘛
在类成员函数后面加上const关键字后,这个函数就能够被const对象和非const对象调用
如果类成员函数后面没有const关键字,那么这个函数就只能被非const对象调用
什么意思呢?
还是看上面的那个例子:
对于加了const关键字的isbn函数,main函数中的a对象的类型既可以是Sale_Date,也可以是const Sale_Date
对于没加const关键字的isbn函数,main函数中的a对象的类型只能是Sale_Date,不能是const Sale_Date,否则就不编译错误
那么关于const放在类成员函数后面还有没有什么其他的作用了呢?
暂时没有了,要是还有了话,我之后再来补上。。。
对于this指针补充一点,this指针本身是一个const指针,只不过这个const是顶层const,也就是自身不能够改变,就是说他指向的地址是固定不变的
函数名后面加上const关键字后,this指针就的const就既是顶层const,也是顶层const,也就是说,this指针指向的地址和该地址里面的内容都是不能改变的。