c++ static 类成员

对于特定类型的全体对象而言,访问一个全局对象有时是有必要的。也许,在程序的任意点需要统计以创建的特定类类型对象的数量。但是全局对象会破坏封装,并且没有安全保护,一般的用户代码就可以修改这个值。类可以定义静态成员,用于解决同一个累的不同对象之间数据和函数共享的问题,用一个类的不同对象的静态成员使用同一个内存空间,但是又不破坏封装。类的静态成员包括静态数据成员和静态成员函数。

澳门新葡亰手机版,c++ static 类成员

一.什么是static类成员

对于特定类类型的全体对象而言, 访问一个全局对象有时是必要的.
然后,全局对象会破坏封装: 对象需要支持特定类抽象的实现. 如果对象是全局的,
一般的用户代码就可以修改这个值.
类可以定义类静态成员,而不是定义一个可普遍访问的全局对象. 通常,
非static数据成员存在于类类型的每个对象中. 不像普通的数据成员,
static数据成员独立于该类的任意对象而存在,
每个static数据成员是与类关联的对象, 并不与该类的对象相关联.

类也可以定义static成员函数. static成员函数没有this形参
(static成员是类的组成部分但不是任何对象的组成部分) ,
它可以直接访问所属类的static成员, 但不能直接使用非static成员.

 

二.使用类的static成员的优点

1)static成员的名字是在类的作用域中,
因此可以避免与其他类的成员或全局对象名字冲突.

2)可以实施封装.static成员可以是私有成员,而全局对象不可以.

3)通过阅读程序容易看出static成员是与特定类关联的.这种可见性可清晰地显示程序员的意图.

 

三.定义static成员

在成员声明前加上关键字static将成员设为static.
static成员遵循正常的公有/私有访问规则.

 

class A
{
   public:
     static int Getval() { return value;}
     static void Setval( int );
  private:
    static int value;
}
 int A::value=0; //初始化

 

四.使用类的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
数据成员就可以在类的定义体中进行初始化:

 

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; //初始化

 const int A:: num;

 

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成员函数中修改.

static 类成员 一.什么是static类成员
对于特定类类型的全体对象而言, 访问一个全局对象有时是必要的.
然后,全局对象会破坏封装: 对象需…

通常,非static数据成员存在于类类型的每个对象中。不像普通的数据成员,static数据成员独立于该类的任意对象而存在;每个static数据成员一样,类也可以定义static成员函数。static成员函数没有this形参,可以直接访问所属类的static成员,但不能直接使用非static成员。使用类的static成员有以下几点好处:

一.有利于类的封装,可以吧static成员定义为私有成员,防止外部访问。