const成员函数及const

在成员函数参数列表后面加上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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值