静态成员,是类中不依赖于类对象而独立存在的成员变量,但仍然属于类,是成员的一种
静态成员的空间分配发生在出现编译阶段,不占用类的空间
静态成员分为,静态成员变量和静态成员函数
静态成员变量
1、相关概念
1)静态成员的权限一般为public,必须在全局处进行定义,类内只是声明,如果没有在全局处进行定义,那么默认为0
2)静态成员变量,不占用类对象的内存空间,在编译时系统就分配了内存空间
3)虽然静态成员不占用类对象的空间,但是,也可以通过类对象调用静态成员变量
4)所有类对象,共享该静态成员变量,无论实例化多少个类对象,静态成员只有一份
5)静态成员变量,从功能上来说,可以理解成是一个全局变量,但是相比于全局变量而言,静态成员变量更加体现了类的封装性
2、定义及访问
1)定义格式:在定义成员变量时,在前面加关键字static,该成员变量就是静态成员变量
2)静态成员变量的访问
a.对象名.静态成员变量
b.类名::静态成员变量
cpp
#include <iostream>
using namespace std;
class Demo
{
private:
int p;
public:
static int s;
};
int Demo::s = 0;
int main()
{
//通过类名引用
Demo::s++;
cout<<Demo::s<<endl;
//通过类对象引用
Demo d;
d.s++;
cout<<d.s<<endl;
return 0;
}
静态成员函数
1、相关概念
1)和静态成员变量一样,不依附于某个具体的类对象,属于整个类的
2)静态成员函数中,只能使用静态成员变量,不能使用非静态成员变量
3)静态成员变量中没有this指针,但是,同名的静态成员函数与非静态成员函数不构成重载关系
2、定义及调用
1)定义格式:在定义成员函数前加关键字static,那么该函数就是静态成员函数
2)静态成员函数的调用方式也有两种:通过类对象调用,通过类名直接调用
cpp
#include <iostream>
using namespace std;
class Demo
{
private:
int p;
public:
static int s;
//非静态成员函数
void show()
{
cout<<p<<endl;
}
//静态成员函数
/*
static void show()
{
cout<<p<<endl;
}
*/
//静态成员函数 与 同名非静态成员函数 不构成重载
//error: static and non-static member functions with the same parameter types cannot be overloaded
//note: previous definition is here
//静态成员函数中 只能使用 静态成员变量
//error: invalid use of member 'p' in static member function
static void show(int)//哑元占位
{
cout<<s<<endl;
}
};
int Demo::s = 0;
int main()
{
//静态成员函数 在类实例化前 也能使用
//通过类名调用
Demo::show(50);//哑元接收 50无意义 仅占位
//通过类对象引用
Deom d;
d.show(20);
return 0;
}
C/C++中static总结
1、修饰函数的局部变量,表示将当前变量独立于整个函数而存在,其生命周期随着整个程序的编译而产生,整个程序结束而终止,即使函数没有被调用,静态成员变量的内存空间也已经存在了,即使函数以及运行结束,静态成员变量的生命周期也没有结束。一次初始化,后期调用函数时,都具有保值功能。
2、修饰类中成员变量,为静态成员变量,不依附于类对象而存在,编译时系统分配空间,需要在全局处进行定义。即使没有类对象,也可以通过类名直接使用,也可以通过类对象进行使用。多个对象,共享静态成员变量,即使类对象的空间全部都释放后,静态成员的空间也没有结束,而是随着整个程序的结束而结束。
3、修饰全局变量时,表示限制作用域为当前文件,只能在当前文件内使用该全局变量,其他文件不能使用,即使使用extern也不可以
4、修饰全局函数时,表示限制作用域为当前文件,只能在当前文件内使用该函数,其他文件中不可以使用,即使使用了联合编译
5、修饰类中的成员函数,表示静态成员函数,独立于类体而存在,也可以使用类对象进行调用。即使没有实例化对象,也可以类名调用,静态成员函数中,只能访问静态成员变量,不能访问非静态成员变量。没有this指针。