static成员
概念
声明为static的类成员称之为类的静态成员,使用static修饰的成员变量称之为静态成员变量,使用static修饰的成员函数称之为静态成员函数。
特性
- 静态成员为所有的类对象所共享,并不属于某一个具体的类对象
class Test{
private:
static int _a;
};
int main(){
cout << sizeof(Test) << endl;
}
输出结果:
1
可以看到上述的输出结果是1,因为静态成员_a是存储在内存的全局数据区的(.bss段),属于整个类或者说的类的所有对象的,因此在计算类的大小的时候静态变量并不会计入其总大小中。
- 静态成员变量必须在类外定义,定义的时候不用添加static关键字。
class Test{
private:
static int _a;
};
// 这里是一个特例,直接突破了类域对其进行访问。
int Test::_a = 1;
- 静态成员函数没有隐含的this指针,不能访问任何非静态的成员成员
class Test
{
public:
static void myFunc()
{
cout << _a << endl; // 错误,不能访问非静态成员
cout << _b << endl; // 可以访问类的静态成员函数
}
private:
int _a; // 非静态
static int _b; // 静态
};
- 访问静态成员变量的方法
1.当类的静态成员变量为共有的时候
class Test{
public:
static int _a;
};
int Test::_a = 1;
int main(){
Test t1;
cout << t1._a << endl; // 通过类对象进行访问
cout << Test::_a << endl; // 通过类名来进行访问
cout << Test()._a << endl; // 直接通过匿名对象进行访问
}
2.当类的静态成员变量为私有的时候
class Test{
public:
static int myGetA(){
return _a;
}
private:
static int _a;
};
int Test::_a = 1;
int main(){
Test t1;
cout << t1.myGetA()<< endl; // 通过类对象调用共有接口进行访问
cout << Test::myGetA() << endl; // 通过类名调用共有接口来进行访问
cout << Test().myGetA() << endl; // 直接通过匿名对象调用共有接口进行访问
}

浙公网安备 33010602011771号