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

};


除了static数据成员还有一个比较特殊的是mutable成员, mutable成员的用法也是在类型名前面加上mutable, mutable成员永远不能为const, 它的值可以在const成员函数中修改.

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。