1.关键字
static
包含:
静态变量:static int a;
静态函数:static int fun(){}
2.静态变量
1)不能通过初始化列表来初始化静态变量
#include <iostream>
#include <string>
using namespace std;
class Cperson
{
public:
Cperson():a(12)
{
}
~Cperson()
{
}
private:
static int a;
};
int main()
{
system("pause");
return 0;
}
编译器报错:
2)只能通过类外初始化,类外初始化也不能添加static修饰符,格式为:类名::静态变量=数值;
初始化不能放在主函数中,放在类和主函数之外
可以通过类来访问静态变量,格式为:类名::静态变量;这种方法也只限于静态变量是公共成员,如果是私有成员,那么也是无效的,只能通过函数返回或者友元
私有静态变量,也是通过类外部初始化的
#include <iostream>
#include <string>
using namespace std;
class Cperson
{
public:
Cperson():b(13)
{
}
static int a;
int b;
private:
static int c;
};
int Cperson::a = 12; //public静态变量初始化
int Cperson::c = 14; //private静态变量初始化
int main()
{
cout << Cperson::a << endl; //正确,可以通过类作用域来访问静态变量
//cout << Cperson::b << endl; //错误,变量b不是静态变量
//cout << Cperson::c << endl; //错误,静态变量c是私有成员,外部不能访问
Cperson::a = 13; //正确,可以通过类的作用域来改变静态变量的值
//Cperson::b = 13; //错误,变量b不是静态成员
//Cperson::c = 13; //错误,静态变量c是私有成员,外部不能访问
Cperson op;
cout << op.a << endl; //也可以通过对象来访问静态变量
system("pause");
return 0;
}
执行结果:
3)可以在类中对静态常量整型变量进行初始化:static const int a=1;
4)静态成员变量属于类的属性,而不属于对象。它是所有对象共有的一个部分。可以通过类名来访问也可以通过对象来访问
3.静态函数
1)调用方式和静态变量一样,可以通过类作用域来调用,也可以通过对象来调用
#include <iostream>
#include <string>
using namespace std;
class Cperson
{
public:
static void fun()
{
cout << "I am static" << endl;
}
};
int main()
{
Cperson::fun();
Cperson op;
op.fun();
system("pause");
return 0;
}
执行结果:
4.注意
1)静态成员无this指针
2)不能调用类中普通成员,包括变量和函数,但可以调用静态成员
原因:
this指针在对象创建之后才会产生,静态成员跟对象没有直接的关系,它是类本身的一个属性,只有类存在,那么静态成员就存在,在内存中就有空间;居然跟对象没有联系,所以跟this指针也没有联系
#include <iostream>
#include <string>
using namespace std;
class Cperson
{
public:
Cperson() :a(12)
{
}
static void fun()
{
//this->a = 13; //错误,静态函数没有this指针
//this->b = 13; //错误,静态函数没有this指针
//cout << a << endl; //错误,静态函数不能访问非静态变量
cout << b << endl; //正确,静态函数可以访问静态变量
cout << "I am static" << endl;
}
private:
int a;
static int b;
};
int Cperson::b = 12;
int main()
{
Cperson::fun();
system("pause");
return 0;
}
执行结果: