静态成员(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、静态成员函数可以当作访问私有的静态成员变量的公开接口,一方面不破坏类的封装性,另一方面可以无需实例化对象也能调用类的静态成员,让类本身具有管理自己成员的能力
标签:变量,静态,成员,C++,对象,static,函数 From: https://www.cnblogs.com/ljf-0804/p/17655420.html