c++ static 类成员
一.什么是static类成员
对于特定类类型的全体对象而言, 访问一个全局对象有时是必要的. 然后,全局对象会破坏封装: 对象需要支持特定类抽象的实现. 如果对象是全局的, 一般的用户代码就可以修改这个值. 类可以定义类静态成员,而不是定义一个可普遍访问的全局对象. 通常, 非static数据成员存在于类类型的每个对象中. 不像普通的数据成员, static数据成员独立于该类的任意对象而存在, 每个static数据成员是与类关联的对象, 并不与该类的对象相关联.
类也可以定义static成员函数. static成员函数没有this形参 (static成员是类的组成部分但不是任何对象的组成部分) , 它可以直接访问所属类的static成员, 但不能直接使用非static成员.
二.使用类的static成员的优点
1)static成员的名字是在类的作用域中, 因此可以避免与其他类的成员或全局对象名字冲突.
2)可以实施封装.static成员可以是私有成员,而全局对象不可以.
3)通过阅读程序容易看出static成员是与特定类关联的.这种可见性可清晰地显示程序员的意图.
三.定义static成员
在成员声明前加上关键字static将成员设为static. static成员遵循正常的公有/私有访问规则.
<span style="font-size:14px;">class A { public: static int Getval() { return value;} static void Setval( int ); private: static int value; } int A::value=0; //初始化</span>
四.使用类的static成员
可以通过作用域操作符从类直接调用static成员, 或者通过对象,引用,或指向该类类型的对象的指针间接调用.
A pg;
A *pg1=&pg;
int B;
B=pg.Getval();
B=pg1->Getval();
B=A::Getval();
五.类的成员函数
当static成员函数定义在类的外部时, 无须重复指定static关键字, 该保留字只出现在类定义内部的声明处:
void A:: Setval( int newVal)
{
value=newVal;
}
static成员不是任何对象的组成部分, 所以static成员函数不能声明为const, 毕竟, 将成员函数声明为const就是承诺不会修改该函数所属的对象. static成员函数也不能声明为虚函数.
六.static数据成员
static数据成员可以声明为任意类型: 常量, 引用, 数组, 类类型, 等等.
static数据成员必须在类定义的外部定义(正好一次), 不像普通数据成员, static成员不是通过类构造函数进行初始化, 而是应该在定义时进行初始化.
定义方式如下:
先指定类型名, 接着是成员的完全限定名
int A::value=0; //初始化
1)特殊的整型const static 成员
一般而言static成员像普通数据成员一样不能在类的定义体中初始化. 但有一个例外, 那就是只要初始化是一个常量表达式, 整型const static 数据成员就可以在类的定义体中进行初始化:
<span style="font-size:14px;">class A { public: static int Getval() { return value;} static void Setval( int ); private: static const int num = 10; int Sz[num]; static int value; } int A::value=0; //初始化</span>
<span style="font-size:14px;"> const int A:: num;</span>
const static 数据成员在类的定义体中初始化时, 该数据成员仍必须在类的定义体之外进行定义.
2) static 成员不是类对象的组成部分
static 成员独立于任何对象而存在, 不是类类型对象的组成部分. 它们的使用方式对于非static数据成员而言是不合法的.
例如static 数据成员的类型可以是该成员所属的类类型. 而非static成员被限定声明为其自身类对象的指针或引用.
class C
{
private:
static C tmp; //ok
C tmp; //wrong
};
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。