【c++】static和const修饰类的成员变量或成员函数


目录

1、静态成员变量

2、静态成员函数

3、常函数

4、常对象


当我们使用c++的关键字static修饰类中的成员变量和成员函数的时候,此时的成员变量和成员函数被称为静态成员。

静态成员包含:

  • 静态成员变量
  • 静态成员函数

1、静态成员变量

静态成员变量有着如下几个特点:

  1. 所有对象共享一份数据
  2. 在编译阶段分配内存
  3. 类内声明,类外初始化

【c++】static和const修饰类的成员变量或成员函数_第1张图片

需要我们牢记的是,空类的内存空间大小为1,是为了每个空类对象一个独一无二的地址。

当我们在类内声明静态成员变量之后,需要在类外定义静态成员变量:

int Data::m_varA = 10;
int Data::m_varB = 10;

定义多个类对象,打印出不同类对象的同一个静态成员变量,可以很明显看出结论:类对象共享静态成员变量的同一份数据

【c++】static和const修饰类的成员变量或成员函数_第2张图片

 对于私有权限下的静态成员变量m_varB,发现在类的外部是无法访问的:

【c++】static和const修饰类的成员变量或成员函数_第3张图片

 这说明了:静态成员变量也是有访问权限的。

由于静态成员变量是在编译期间分配的,那么可以不可以通过类名直接访问静态成员变量呢?

实践出真知,运行效果图如下: 

【c++】static和const修饰类的成员变量或成员函数_第4张图片

 那么我们就需要记得:静态成员变量有两种访问方式,第一种是通过对象,第二种是通过类名

2、静态成员函数

静态成员函数有着如下的特点:

  • 程序共享一个函数
  • 静态成员函数只能访问静态成员变量

对于第一个特点程序共享一个函数怎么理解,通过案例代码来进行深刻理解:

class Data
{
public:

	static void func()
	{
		cout << "static void func()函数调用" << endl;
	}
private:

};

int main(void)
{
	Data d1;
	Data d2;

	d1.func();
	cout << "d1 -> func()函数的地址为 : " << &d1.func << endl;
	d2.func();
	cout << "d2 -> func()函数的地址为 : " << &d2.func << endl;

	return 0;
}

【c++】static和const修饰类的成员变量或成员函数_第5张图片

静态成员变量有着访问权限的限制问题,那对应的静态成员函数也有着同样的访问权限问题:

【c++】static和const修饰类的成员变量或成员函数_第6张图片

当我们使用静态成员函数的时候,静态成员函数只能访问静态成员变量,其余变量是无法访问的,从而得出以下结论:静态成员函数只能访问静态成员变量

【c++】static和const修饰类的成员变量或成员函数_第7张图片

静态成员函数和静态成员变量一样,也有着两种访问方式通过对象和类名访问

【c++】static和const修饰类的成员变量或成员函数_第8张图片

3、常函数

成员函数加const后我们可以称这个函数为常函数,常函数有着如下特点:

  • 常函数内不可以修改成员属性
  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改
class Data 
{
public:
	Data() 
	{
		m_A = 0;
		m_B = 0;
	}

	void change() const
	{
		this->m_A = 100;
	}
	int m_A;
	mutable int m_B; //可修改 可变的
};

此上述案例代码看起来却似乎没有问题,但是当我们运行的时候会出现报错,因为在常函数里面是不被允许修改成员变量的。如果想要在常函数中修改成员变量,需要在变量前加mutable这个关键字,有了mutable关键字之后,该成员变量就可以在常函数中修改了。

【c++】static和const修饰类的成员变量或成员函数_第9张图片

4、常对象

声明对象前加const称该对象为常对象,常对象有着如下特点:

  • 常对象只能调用常函数
class Data 
{
public:
	Data() 
	{
		m_A = 0;
		m_B = 0;
		//cout << "int m_A = " << m_A << endl;
		//cout << "mutable int m_B = " << m_B << endl;
	}
	void func()
	{
		cout << "func()函数调用" << endl;
	}

	void change() const
	{
		//this->m_A = 100;
		this->m_B = 100;
	}
	int m_A;
	mutable int m_B; //可修改 可变的
};

int main(void)
{
	//Data d1;
	//d1.change();
	//cout << "d1 -> int m_A = " << d1.m_A << endl;
	//cout << "d1 -> mutable int m_B = " << d1.m_B << endl;

	const Data d1;
	//常对象不能修改成员变量的值,但是可以访问
	//d1.m_A = 100;
	cout << "const Data d1 -> int m_A = " << d1.m_A << endl;
	cout << "const Data d1 -> mutable int m_B = " << d1.m_B << endl;

	//常对象只能使用常函数
	//d1.func();
	d1.change();
	cout << "const Data d1 -> int m_A = " << d1.m_A << endl;
	cout << "const Data d1 -> mutable int m_B = " << d1.m_B << endl;

	return 0;
}

【c++】static和const修饰类的成员变量或成员函数_第10张图片

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