C++静态成员(static)

发布时间 2023-08-24 22:54:50作者: 冲他丫的

静态成员(static)

什么是静态成员:

被static修饰的成员/成员函数就叫静态成员,不管有多少对象,静态成员只有一份存于公共内存中。

设计静态数据成员目的是信息共享和信息交流

普通成员特点:

  • 成员变量:每个类对象中都有一份属于自己的成员变量,相互独立、没有关联。普通成员与对象绑定,随对象的建立而建立,随对象的消亡而释放,类似于局部变量或malloc堆内存。

  • 成员函数:隐藏着一个this指针,接受调用者的地址,用于区分调用者

静态成员特点:

静态成员变量:

1、存储在data/bss段,一个类中的所有静态成员变量只有唯一一份,被所有类对象共享

2、一旦成员变量被声明为静态成员变量,通过sizeof计算类字节时,就不统计该成员的字节数,即静态成员变量在对象中不占用存储空间,只是一个申明,他的内存空间与全局变量在一个区域。

class Test
    {
        int a;
    };
    cout << sizeof(Test) << endl;    //4 
class Test
    {
       static int a;
    };
    cout << sizeof(Test) << endl;    //1 

3、静态成员变量必须在类内加static声明在类外单独定义、初始化(生命周期被延长),定义时无需加static,不能在构造函数的初始化列表中创建,也不能用初始化列表来初始化,初始化时如果不赋初值,默认等于0。

4、静态成员变量的生命周期不再依赖于某个类对象,伴随整个程序的生命周期

5、因为静态成员变量的存在不依赖任何类对象(属于类但是不属于对象),所以可以不实例化类对象就直接访问

    类名::静态成员变量    //    无需实例化对象
    
    对象名.成员变量/静态成员变量    //public
    对象名->成员变量/静态成员变量

静态成员函数:

1、没有隐藏的this指针,所以在静态成员函数中,不能直接访问普通成员变量、普通成员函数,但是可以间接访问(手动传递对象的地址),毕竟静态成员函数还是属于类的

2、可以直接访问静态成员变量和静态成员函数

3、想要静态修饰成员函数,只能在类中添加static,不能在外部实体函数添加,因为外部实体函数前添加static与文件内作用域功能的static冲突。

4、调用方式:

    对象名.成员函数()/静态成员函数()
    对象名->成员函数()/静态成员函数()
    
    类名 ::静态成员函数()    //无需实例化

实例:

#include <iostream>
using namespace std;

class Test
{
	static int a;	
	int b;
public:
	static void show(Test* t)
	{
		cout << a << endl;	
		cout << t->b << endl;
	}
	static void show_a(void)
	{
		cout << a << endl;	
	}
};

int Test::a = 88;

int main(int argc,const char* argv[])
{
	cout << sizeof(Test) << endl;
	Test::show_a();
	/*
	cout << Test::a << endl;
	Test::a = 99;
	cout << Test::a << endl;

	Test t1,t2;
	t1.show(&t1);
	t1.a = 1234;
	t1.show(&t1);
	t2.show(&t2);

	cout << &t1.a << " " << &t2.a << endl;
	*/
}

静态成员的作用:

1、静态成员相当于多了一层类作用域的全局变量、全局函数

2、静态成员变量适合存储所有类对象的公共属性,从而节约资源(如税率、利率等)

3、静态成员函数可以当作访问私有的静态成员变量的公开接口,一方面不破坏类的封装性,另一方面可以无需实例化对象也能调用类的静态成员,让类本身具有管理自己成员的能力