关键字static可以用于说明一个类的成员或函数,当把一个类的成员说明为static时,无论这个类创建了多少对象,这些对象都共享这个static成员。
静态成员与静态成员函数都属于整个类,并不属于对象的。
调用静态成员(变量/函数)
类名::成员();
静态成员函数不能直接调用非静态成员:
以下文字与理解摘自 来自:https://www.cnblogs.com/MATU/p/3818163.html
例如:
#include "iostream"
using namespace std;
class test
{
private:
int x;
int y;
public:
static int num;
static int Getnum()
{
x+=5; // 这行代码是错误的,静态成员函数不能调用非静态数据成员,要通过类的对象来调用。
//而访问非静态数据成员必须通过参数传递的方式得到一个对象名,然后通过对象名来访问。
num+=15;
return num;
}
};
int test::num = 10;
int main(void)
{
test a;
cout<<test::num<<endl; //10
test::num = 20;
cout<<test::num<<endl; //20
cout<<test::Getnum()<<endl; //35
cout<<a.Getnum()<<endl; //50
system("pause");
return 0;
}
静态成员函数可以直接访问该类的静态数据和函数成员,而访问非静态数据成员必须通过参数传递的方式得到一个对象名,然后通过对象名来访问。
总结:
1、static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。
2、静态成员不能在类定义里边初始化,只能在class body外初始化,出现在类体外的函数定义不能指定关键字static。
3、静态成员仍然遵循public,private,protected访问准则。
4、静态成员函数没有this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用。
5.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
6.非静态成员函数可以任意地访问静态成员函数和静态数据成员;
7.静态成员函数不能访问非静态成员函数和非静态数据成员;
8.由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长;