【从 C 向 C++ 进阶】- 类 - 8. 类与 static

从 C 向 C++ 进阶系列导航


1. 静态成员变量

静态成员变量为特殊的成员变量,存储在静态存储区,被所有类对象共用,不为任意对象私有,因此类对象的大小不包含静态成员变量。定义方式比较特殊,需要在类内部声明为:static type varname;,然后在全局作用域内进行初始化:type classname::varname = initvalue;

  • 示例:
class Test
{
private:
    static int m_Var;     // 声明
}

int Test::m_Var = 0;      // 定义

在程序中,可以使用“类::变量”的方式直接使用公有的静态成员变量而无需通过类的方式。而私有的静态成员变量可实现安全的多个对象之间的数据共享,因为此时的静态成员变量只能在类的成员函数内使用。

  • 实验:
class Test 
{
private:
	static int pr_var;	
	
public:
	static int pu_var;
	void print(void)
	{
		cout << "pr_var = " << pr_var << ", "
			 << "pu_var = " << pu_var << endl;
	}
};

int Test::pu_var = 0;       // 初始化
int Test::pr_var = 0;       // 初始化

int main()
{
    Test::pu_var = 6;
	cout << "Test::pu_var = " << Test::pu_var << endl;	// Test::pu_var = 6
	// Test::pr_var = 7;	// error: ‘int Test::pr_var’ is private
	Test obj;
	obj.print();	        // pr_var = 0, pu_var = 6
	// obj.pr_var = 5;		// error: ‘int Test::pr_var’ is private
    return 0;
}

2. 静态成员函数

为了管理静态成员变量,C++ 提供了静态成员函数,提供对外接口。静态成员函数是类的特殊成员函数,被所有类对象共用,因此无隐藏的 this 指针。在函数声明时,只需在类内使用 static 修饰,在类外的实现中无需加上 static 修饰。

  • 示例:
class Test
{
public:
    static void fun(void){};
}

void Test::fun(void)
{
    ...
}

在程序中,可通过“类::函数”的方式直接调用静态成员函数而无需通过对象的方式。静态成员函数只能访问静态成员变量,无法访问普通的成员变量,具有更高的安全性。

  • 静态成员函数与普通成员函数对比
静态成员函数 普通成员函数
所有对象共用 yes yes
this 指针 no yes
访问普通成员变量 no yes
访问静态成员变量 yes yes
通过类名调用 yes no
通过对象调用 yes yes
  • 实验:
class Test 
{
private:
	static int pr_var;
	int pr_var;
	
public:
	static int pu_var;
	static void print(void)
	{
		// cout << "pr_var = " << pr_var << endl;	// error: invalid use of member ‘Test::pr_var’ in static member function
		cout << "pr_var = " << pr_var 
			 << ", pu_var = " << pu_var << endl;
	}
};

int Test::pu_var = 0;
int Test::pr_var = 0;

int main()
{
    Test::pu_var = 6;
	Test::print();	                                // pr_var = 0, pu_var = 6
    return 0;
}
发布了60 篇原创文章 · 获赞 36 · 访问量 5956

猜你喜欢

转载自blog.csdn.net/qq_35692077/article/details/96034267
今日推荐