static成员

概念

声明为static的类成员称之为类的静态成员,使用static修饰的成员变量称之为静态成员变量,使用static修饰的成员函数称之为静态成员函数。

特性

  • 静态成员为所有的类对象所共享,并不属于某一个具体的类对象
class Test{
private:
	static int _a;
};

int main(){
	cout << sizeof(Test) << endl;
}

输出结果:
1

可以看到上述的输出结果是1,因为静态成员_a是存储在内存的全局数据区的(.bss段),属于整个类或者说的类的所有对象的,因此在计算类的大小的时候静态变量并不会计入其总大小中。

  • 静态成员变量必须在类外定义,定义的时候不用添加static关键字。
class Test{
private:
	static int _a;
};
// 这里是一个特例,直接突破了类域对其进行访问。
int Test::_a = 1;
  • 静态成员函数没有隐含的this指针,不能访问任何非静态的成员成员
class Test
{
public:
	static void myFunc()
	{
		cout << _a << endl; // 错误,不能访问非静态成员
		cout << _b << endl; // 可以访问类的静态成员函数
	}
private:
	int _a; // 非静态
	static int _b; // 静态
};
  • 访问静态成员变量的方法

1.当类的静态成员变量为共有的时候

class Test{
public:
	static int _a;
};
int Test::_a = 1;

int main(){
	Test t1;
	cout << t1._a << endl;     // 通过类对象进行访问
	cout << Test::_a << endl;  // 通过类名来进行访问
	cout << Test()._a << endl; // 直接通过匿名对象进行访问
}

2.当类的静态成员变量为私有的时候

class Test{
public:
	static int myGetA(){
		return _a;
	}
private:
	static int _a;
};
int Test::_a = 1;

int main(){
	Test t1;
	cout << t1.myGetA()<< endl;     // 通过类对象调用共有接口进行访问
	cout << Test::myGetA() << endl;  // 通过类名调用共有接口来进行访问
	cout << Test().myGetA() << endl; // 直接通过匿名对象调用共有接口进行访问
}
posted @ 2024-09-12 22:09  alone_qing  阅读(20)  评论(0)    收藏  举报