一、静态成员变量
类的静态成员变量是直接与类联系,属于类的成员而不是对象,供所有对象共享,存放于全局区,因而不计入类的内存计算。
静态成员变量可以通过类直接访问。
(1)静态成员变量的初始化
静态成员不属于类的任何对象,所以并不是对象建立时被定义的,所以它不能由类的构造函数初始化,一般也不能在类内初始化。
关键字static只出现类的内部。
1、在类外定义且初始化
2、常量静态成员可以在类内初始化
一般来说无论怎样静态成员变量都需要在类外进行定义(定义可以初始化赋值,如果不显示初始化就是默认初始化)
(2))静态成员变量的访问
1、使用类作用域运算符直接访问
2、使用类的对象访问
3、成员函数可以直接访问
#include <iostream>
using namespace std;
class A
{
public:
A(){}
int val();
static int stval();
static int ac;
const static int bc=2;//常量静态成员可以在类内初始化
private:
static int dc;
int nn;
};
int A::ac=1; //类外定义且初始化
int A::dc=1;
int A::stval()
{
// nn=10; 静态成员函数不能调用非静态成员
dc=20;
return dc;
}
int A::val()
{
dc=ac;
return dc;
}
int main()
{
A a;
cout<<a.ac; //使用类的对象访问
cout<<a.val();
cout<<A::bc; //类作用域运算符直接访问
cout<<A::stval();
cout<<a.stval();
return 0;
}
(2)静态成员能使用的某些场景,普通成员不可以的
1、静态成员可以是不完全类型
2、静态成员可以作为默认实参
3、作为类对象的共享成员
class B
{
public:
B(){}
private:
int val;
static B num1; //静态成员与指针都可以是非完整类型
B* num2;
// B num3; //普通成员变量必须是完整类型
};
class C
{
public:
C(char c = bkg){}
// C(int v = yb){} 出错,普通成员变量不能作为默认实参
private:
char df;
int yb;
static int yy;
static const char bkg='a';
};
int C::yy=1;
int main()
{
B b;
C c;
return 0;
}
二、静态成员函数
1、静态成员函数类似于静态成员变量都属于类而不是对象。
2、静态成员函数仅可以调用类的静态成员变量,不可以调用普通成员变量。
3、不具有this指针,因而自然不能声明为const。
class A
{
public:
A(){}
int val();
// static int stval ()const; 出错,不具有this指针
private:
static int bc=2;//常量静态成员可以在类内初始化
};