C++——静态成员详解
Posted Albert Nie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++——静态成员详解相关的知识,希望对你有一定的参考价值。
有时候,类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联,而这就是静态成员。
本质:静态成员与类本身直接相关,而不与类对象保持关联,除此之外,它和其他类成员基本一样。
静态成员包括:静态成员数据,静态成员函数
如何声明?
在成员声明之前加上static
关键字。
class A {
public: // or private
static int a; // 静态成员数据声明,也是定义
static int func(); // 静态成员函数声明
static int func() const; // error!
}
note : 静态成员函数也不与任何对象绑定在一起,即不拥有this指针,这也就导致了静态成员函数体内不能使用this指针,也不能访问非静态成员(隐式this指针),且其不能被声明为const(因为const表示该函数不会修改对象的成员数据,而static函数压根不能访问对象(非类)的数据成员,也就谈不上修改了,故而c++规定不能用将静态成员函数声明为const。)
再次强调:静态成员函数只能访问类的静态成员变量。
如何定义?
注意,这时成员数据和成员函数的行为是不同的。
-
成员数据
- 通常在外部初始化
int A::a = 10;
- 如果非要在内部初始化,那么成员数据必须是 constexpr 或者 const 修饰的整数类型,初始值必须是字面值常量整数类型
class A{ // ok,但只能用于类内替换,否则必须在外部重新定义(具体见C++ primer 5nd p271),但不需要再次指定初始值 static constexpr int a = 10; static const float a = 10.0; // error 不是整数类型 static int a = 10; // error! }
-
成员函数:内类内外都可定义,不写
static
关键字。
int A::func(){ // 内外定义,加上类作用域,不写static关键字
....
}
如何使用?
- 通过作用域运算符访问
cout << A::a << endl;
- 和普通成员函数一样
A obj;
A* ptr;
cout << obj.a << endl; // 通过对象(或引用)访问
cout << ptr->a << endl; // 通过指针访问
特殊场合
- 静态数据类型可以是不完全类型,特别的,静态数据成员的类型可以就是它所属的类类型,普通成员则不行。
class A{
static A a; // ok
A b; // error!
}
- 静态成员可以做默认实参,普通成员则不行。
class A{
static int a;
int func(int num = a;)
}
参考资料: c++ primer 5nd p268–p272。
以上是关于C++——静态成员详解的主要内容,如果未能解决你的问题,请参考以下文章