游戏开发之C++类中的static、const梳理总结(C++基础)

187 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

游戏开发之C++类中的static、const梳理总结(C++基础)

TIPS:一个空类的内存大小为1个字节。 static、const部分知识来源【点击跳转】

	class B { };
	//sizeof(B) = 1

1.类中的静态成员(static)

类中的静态成员包括静态成员函数和静态成员变量。

1.1 静态成员函数

①不需要类对象便可直接调用,注意静态成员函数不能直接访问成员变量、成员函数及const成员变量及const成员函数。只能访问静态成员变量、类的构造函数。 ②类的静态成员函数没有this指针。 作用:主要是作为该类作用域下的全局函数。 静态成员函数受权限约束(公有权限外部类外可访问,私有权限类外不能访问)。 在类中,声明语法:static 数据类型 函数名(形参列表){函数体} 静态成员的访问方式: a、类名::函数名(); b、类变量名.函数名();

	class A
	{
	private:
	public:
		A() { }
		A(int a_) { }
		int a;
		//类内静态成员变量初始化,权限为public则类外可以访问。
		static void Print(const char* str)
		{
			//a = 10;错误,无法访问
			//A(); 正确。
			//Print2(); 错误,静态成员函数无法访问成员函数
			//std::cout << this << std::endl;错误,静态成员变量没有this指针
			std::cout << "Print" << str << std::endl;
		}
		
		void Print2()
		{
			std::cout << "Print2" << std::endl;
		}
	};

	int main()
	{
		//访问方式
		//与命名空间的访问类似,原理想不多
		A::Print("hello");
		A a1;
		a1.Print("hello !");
		return 0;
	}

1.2 类中的静态成员变量

必须在类外初始化且只初始化一次!类内可以被成员函数或静态成员函数直接访问。 静态成员变量受权限约束(公有权限外部类外可访问,私有权限类外不能访问)。但类外初始化的时候不收权限约束。 TIPS:静态成员变量在一个类中只有一份,即针对不同的类对象它是公共的。 在类实例化时,静态成员变量不占用申请的内存空间(即一个类对象中它不占空间),它的内存空间直接存储在静态全局区。 类内声明语法:static 数据结构 变量名; 类外定义语法:数据类型 类名::变量名 = 值; 类外访问方式: a、类名::静态成员变量; b、类变量名.静态成员变量; c、通过静态成员函数间接访问。

class A
	{
	private:
	public:
		A() { }
		A(int a_)  { }
		int a;
		//声明静态成员变量
		static int s_a;
		static void Print(const char* str)
		{
			//静态成员函数可以访问静态成员变量
			s_a += 1;
			std::cout << "static " << str << std::endl;
		}

		void Print2()
		{
			//成员函数可以访问静态成员变量
			s_a += 1;
			std::cout << s_a << std::endl;
		}
	};
	//定义静态成员变量
	int A::s_a = 10;

	int main()
	{
		int size = sizeof(A);//4,即没有算上static s_a的大小,内存空间直接存储在静态全局区
		//类外访问静态成员函数的方式
		A::s_a = 100;
		A::Print("hello 1");//static hello 1
		A::Print("hello 2");//static hello 2
		A a2;
		a2.Print2();//103
		a2.s_a = 10;
		a2.Print2();//11,即可以发现s_a是唯一的,在一个类中。
		return 0;
	}
	int main()
	{
		int count = 0;
		while ((++count) != 3)
		{
			static int temp = 1;
			temp++;
			std::cout << temp << std::endl;//2 3,我们可以发现一个静态变量只初始化一次!
		}
		return 0;
	}

2.const成员属性

const可以修饰类内的成员变量和成员属性、静态成员变量、静态成员函数。 const修饰之后,即只可读,不可修改,即常量,但是其不在常量全局区。 const 成员变量/成员函数受权限约束。(公有权限外部类外可访问,私有权限类外不能访问)

2.1 const成员变量及const静态成员变量

const 成员变量,类内初始化方式: ①使用初始化列表初始化,该方式可以通过构造函数重载将const成员变量在不同条件下初始化成不同的值。 ②const 数据类型 变量名 = 值;该方式初始化没有使用初始化列表意义大,使用该方式初始化还不如使用const 静态成员变量。 const 静态成员变量(const static/static const)表示该变量属于类(唯一)且不能修改,即不变且唯一。 const 静态成员变量,声明及定义方式: 类内:const static 数据类型 变量名 = 值;或者 static const 数据类型 变量名 = 值; TIPS:静态const成员变量不能使用初始化列表初始化。且只有静态成员变量才能在类外初始化。

2.2 const 成员函数

const 成员函数:限定函数内不能修改该类的成员函数(静态成员变量除外),防止意外修改,保证程序安全。 语法:数据类型 函数名(形参列表) const{函数体} 访问方式:类变量名.函数名();

2.3 实例

class A
	{
	private:
	public:
		//const成员变量的初始化
		//该方式可以通过构造函数重载将const成员变量在不同条件下初始化成不同的值
		A() :m(11) { }
		A(int a_) :m(12) { }
		int a;
		static int s_a;
		//const成员变量声明和初始化
		const int m = 100;//TIPS:这样初始化没有使用初始化列表意义大,使用该方式初始化还不如使用const 静态成员变量。
		//const 静态成员变量声明
		const static int m1;
		//const 静态成员变量声明及定义方式一
		static const int m2 = 111;
		static void Print(const char* str)
		{
			s_a += 1;
			std::cout << "static " << str << std::endl;
		}

		void Print2()
		{
			s_a += 1;
			std::cout << s_a << std::endl;
		}

		void Print1() const
		{
			// a = 100;错误,无法修改。
			s_a += 1;
			std::cout << "const func " << s_a << std::endl;
		}
	};

	int A::s_a = 10;
	//const 静态成员变量定义方式二
	const int A::m1 = 200;

	int main()
	{
			A::s_a = 100;
			A::Print("hello 1");
			A::Print("hello 2");
			A a2;
			a2.Print2();
			a2.s_a = 10;
			a2.Print2();
			//const成员属性访问方式
			int size2 = a2.m;
			A a3;
			int size5 = a3.m;
			int size3 = a2.m1;
			int size4 = a2.m2;
			a3.Print1();
			return 0;
	}

3.static和const的区别

①static定义的静态成员变量和静态成员函数都是属于类,而非属于类对象。 ②const成员变量,只有在某个对象生命周期内是常量,而对于整个类来说是可变的(因为const从成员变量可以通过初始化列表进行初始化)。 ③类对象在申请const成员变量占用该类对象的内存空间,而静态成员变量不会占用该类对象的内存空间。 版本声明:本文为CSDN博主[ufgnix0802]的原创文章。
原文链接:blog.csdn.net/qq135595696…