C++const修饰成员函数(常函数、常对象相关注意点)

C++const修饰成员函数

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

    const修饰成员函数涉及到this指针的概念。

1.1.this指针

假如定义了一个person类,在调用类中变量时,

m_B = 100;

就会用到this指针,
this->m_B = 100;
this指针的本质是
person * const this
即this为指针常量,那么this的指向就不可以改变!

this = NULL;//这句话就是错的
class Person {
    
    
public:
	Person() {
    
    
		m_A = 0;
		m_B = 0;
	}
	void ShowPerson()  {
    
    
		//系统自动将下面一行变成this->m_B = 100;
		m_B = 100;//调用类中变量
	}
public:
	int m_B;
};

1.2.常函数带来的改变

函数后加上const,带来的改变是this指针又多了一个const修饰,
即: const person * const this

第一个const给this带来的改变是指向的数值不能修改,即:常量指针
第二个const给this带来的改变是指向不能修改,即:指针常量

所以,this的指向和指向的数值都不能修改!

void ShowPerson() const {
    
    
		this = NULL;//报错
		m_B = 100;//报错
	}

1.3.mutable修饰的数据成员

mutable:可改变的
mutable修饰的数据成员可以在常函数中改变数值。

class Person {
    
    
public:
	Person() {
    
    
		m_A = 0;
		m_B = 0;
	}
	void ShowPerson() const {
    
    
		//系统自动将下面一行变成this->m_B = 100;
		m_B = 100;//报错
		m_A = 100;//不报错
	}
public:
	mutable int m_A;//可改变
	int m_B;
};
  1. 常对象
    声明对象前加const称该对象为常对象
    需要注意的几点:

2.1常对象可以修改mutable修饰的数据成员

因为普通成员函数可以修改数据成员的值,此时如果常对象调用普通成员函数,那么就有可能修改数据成员函数的值,而这是与定义相违背的!

void MyFunc()  {
    
    
		//mA = 10000;//修改数据成员的值
	}
void test01() {
    
    

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

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

}

2.2常对象只能调用常函数

这很好理解,常函数保证了数据成员不会随意改动,满足常对象的定义。

猜你喜欢

转载自blog.csdn.net/weixin_48622537/article/details/109753750
今日推荐