C++ 之 const类成员函数

C++ 之 const类成员函数

const修饰的变量称为常变量,不可修改,而const修饰的类成员函数限制为不可修改类的成员,只能读取。
写法是将const放在函数参数列表后面,而不是放在函数前面或者放入参数列表内:

class Test()
{
public:
	int getNum() const;
};

在类体之外定义const函数也需要加const:

int Test::getNum() const{
	return 0;
}

const 成员函数的注意点:

1.const成员函数只能读取类的数据成员,不能修改;非const成员函数可以读写数据成员

—那么为什么const成员函数不可以修改类的数据成员呢???

因为默认this指针。
对象调用成员函数时,会在形参列表的最前面加一个形参this。它是一个常量指针,即指向常量的指针,Type * const ,因为不可以修改this指针保存的地址。
当成员函数参数列表后加了关键字(void getInt() const),此时它的隐式this指针就变成了const Type* const,成了指向常量的常量指针,也就是它指代的内容不可被修改。和Python里面的成员函数形参self相似。


但有一点值得注意,如果成员属性是指针,则const成员函数可以修改指针指向的内容,编译器不会报错。

> 这里是引用

class Name{
public:
	void setName(const string &s) const;
private:
	char *m_sName;
};
void setName(const string &s) const{
	//m_sName = s.c_str(); 	//错误写法,编译器报错
	for (int i = 0; i < s.size(); i++){
		m_sName[i] = s[i];	//不好的风格但是没有错误
	}
}
2.const修饰的类的对象只能调用const函数,不能调用非const函数。

假如有对象Obj,调用函数Obj.getInt(),这时会隐式地传入一个参数 &Obj。
const修饰的对象,传入的参数就是const Type* 类型的。
(1)调用const成员函数时,const成员函数的隐式this指针类型是
const Type * const,是可以进行传参的。
(2)调用非const成员函数,隐式this指针是Type *const 类型,const Type* 不能传参过去(因为值不能给修改),所以const对象不能调用非const函数。
(3)假如Obj是非const对象,它就可以调用const和非const成员函数。因为
Type * 类型的参数传入const Type * const 类型参数和Type * const 类型参数都是可以的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值