C++ 常量成员函数的碎碎知识点

#include
using namespace std;

//常量指针:指向常量的指针  const int* p = &a;   更加关注 不可以通过指针 改变 指针所指向的变量或对象的值;
//指针常量:指针是一个常量  int* const p = &a;   更加关注 指针指向唯一性

class A {
public:       //记得加上作用域,不然默认为私有
	A() {}
	~A() {}

	void A()
	{
		a = 5;
	}

	void isCommon();      //等价于:void isCommon(A* const this);   指针常量
	void isConst() const; //常量成员函数; 等价于:void isCommon(const A* const this);  常量指针 

private:
	int a;
};

void A::isCommon() {}

void A::isConst() const
{
	//this->a = 6;   //(×)  //常量指针所指向的对象是不可以被改变的; 换句话说:在常量成员函数内,成员数据是不可以作为左值被赋值的;
	//(*this).a = 5; //(×)

	int b = this->a;

	return;
}
//const的作用:修改隐式参数this指针的类型 --> 常量指针 --> 不可通过指针改变指针所指对象的值 --> 函数体内的成员变量的读写模式变为只可读不可写;

/*
* 一:常量成员函数的作用:
* ①改变函数体内成员数据的读写模式,从 可读可写 变成 只读;
* ②成员函数加上const可以更便捷的告诉开发者该函数是个只读函数,若你的函数体设计不对成员数据进行赋值,那么建议将函数声明为常量成员函数;
*/


// 二:常量成员函数的调用规则
void test00()
{
	A a;
	a.isCommon();   //非常量指针指向非常量对象  (√)
	a.isConst();    //常量指针指向非常量对象    (√)

	const A aa;
	//aa.isCommon();  //非常量指针指向常量对象    (×)
	aa.isConst();   //常量指针指向常量对象      (√)

	/*
	* C++ Primer原话:默认情况下,this的类型是指向类类型非常量版本的常量指针。
	* 指针类型必须与其所指对象类型一致;但有两个例外:①允许令一个常量指针指向非常量对象;②
	*/
}

//三、常量成员函数注意点:
//   声明和定义时都需要在参数列表后加const;

//**************************************************************************************************************************

//常函数
class Person
{
public:

	//this指针的本质  是指针常量   指针的指向是不可以修改的
	// const Person * const this;
	//在成员函数后面加const,修饰的是this指向,让指针指向的值也不可以修改
	void showPerson() const
	{
		this->m_B = 100;
		//this->m_A = 100;
		//this = NULL; //this指针不可以修改指针的指向的
	}

	void func()
	{
		m_A = 100;
	}

	int m_A;
	mutable int m_B; //特殊变量,即使在常函数中,也可以修改这个值,加关键字mutable
};


void test01()
{
	Person p;
	p.showPerson();
}

//常对象

void test02()
{
	const Person p; //在对象前加const,变为常对象
	//p.m_A = 100;
	p.m_B = 100; //m_B是特殊值,在常对象下也可以修改

	//常对象只能调用常函数
	p.showPerson();
	//p.func();  //常对象 不可以调用普通成员函数,因为普通成员函数可以修改属性
}

int main() 
{

	system("pause");
	return 0;
}

你可能感兴趣的:(C++学习,c++)