C++类与对象笔记十:const修饰成员函数;常函数;常对象

抽象的概念:

常函数:

  • 成员函数后加const后我们称为这个函数为常函数

  • 常函数内不可以修改成员属性

  • 成员属性声明时加关键字mutable后,在常函数中才可以修改

先从this的本质开始说起:

this的本质:是指针常量,指针常量的指向是不可以修改的即谁调用,指向谁,生成对象时,就已经决定了。

this相当于:Person* const this;

如果我们在成员函数或者类内写:this = NULL;会报错:指针常量的指向不可变更。

如果我们向让这个指针常量指向的值也不可变更。那么就需要变更为:加上const。

const Person* const this;

那么对于成员函数而言,将const加在那里呢?

如果加在成员函数前面:那是返回值类型的区域;如果加在中括号里面,那是局部变量。如果加在括号里面那是修饰形参的。所以C++设计者将const加在了括号后面。const修饰对象,修饰的其实是this指针。这个成员函数,就变成了常函数

常函数中是不允许修改指针指向的值:有哪些指针指向的值?只要是C++系统默认在前面加上this->的都算,比如属性等。

有些值,如果想特例:那么需要加上mutable来修饰。



常对象:

  • 声明对象前加const称该对象为常对象

  • 常对象只能调用常函数。

如果我们在实例化对象之前加上const修饰,则对象变成常对象。

常对象也不允许修改指针指向的值。除非加上mutable。

常对象只能调用常函数。换句话说:常对象不可调用不是常函数的成员函数。这是为何?

因为普通成员函数内部,可以修改对象的值(属性),如果常对象,可以调用普通的成员函数,那么就意味着常对象,可以修改属性值,间接完成了值的修改。这与我们的初衷不符。为了保证安全性,所以限制,常对象不可调用非常函数之外的普通成员函数。

代码:

class Person {
public:
	Person() {
		m_A = 0;
		m_B = 0;
	}

	//this指针的本质是一个指针常量,指针的指向不可修改
	//如果想让指针常量指向的值也不可以修改,需要const Person * const this.
    // 表现形式就是:需要声明常函数。在成员函数后面加上const,本质修饰的是this指针。让this指向的值也不可修改。
	void ShowPerson() const {
		//const Type* const pointer;
		//this = NULL; //不能修改指针常量的指向 Person* const this;
		//this->mA = 100; //但是this指针指向的对象的数据是可以修改的

		//const修饰成员函数,表示指针指向的内存空间的数据不能修改,除了mutable修饰的变量
		this->m_B = 100;
	}

	void MyFunc() {
		//mA = 10000;
	}

public:
	int m_A;
	mutable int m_B; // 加上mutable之后,即使在常函数中也可以修改,是可变的。
};


//const修饰对象  常对象
void test01() {

	const Person person; //常量对象  
	cout << person.m_A << endl;
	//person.mA = 100; //常对象不能修改成员变量的值,但是可以访问
	person.m_B = 100; //但是常对象可以修改mutable修饰成员变量

	//常对象访问成员函数
	person.MyFunc(); //常对象不能调用普通成员函数。

}

int main() {

	test01();

	system("pause");

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值