关于类和结构体中静态成员的使用

来源:互联网 发布:淘宝详情页ps怎么切片 编辑:程序博客网 时间:2024/06/06 11:04

类中静态成员的使用

静态成员数据

1.c++静态成员是类的所有对象共享的成员,只能被定义一次。静态数据成员所占的空间不会随着对象的产生而分配,也不会随着对象的消失而回收。定义为私有的静态数据成员不能被外界所访问。静态数据成员可由任意访问权限许可的函数所访问。

2.由于静态数据成员是类的所有对象共享的,而不从属于任何一个具体对象,所以必须对类的静态数据成员进行初始化(无默认),但对它的初始化不能在类的构造函数中进行,其初始化语句应当写在程序的全局区域中,并且必须指明其数据类型与所属的类名。

3.对于在类的public部分说明的静态数据成员,在类的外部可以不使用成员函数而直接访问,但在使用时必须用类名指明所属的类。方式为:类名::成员数据。对于在类的非public部分说明的静态数据成员,则只能由类的成员函数访问,其访问方法与访问类中普通数据成员的访问方法完全一样,但在类的外部不能访问。

 

静态成员函数

1.类的C++静态成员函数只能访问类的静态数据成员,而不能访问类中的普通函数成员(非静态数据成员),因为普通数据成员只有类的对象存在时才有意义。

2.C++静态成员函数与类相联系,而不与类的对象相联系。在为初始化的时候,在类的外部调用类中的公有静态成员函数,必须在其左面加上“类名::”(和静态成员数据相似)。在定义了对象后也可以通过对象访问,但是要注意访问静态方法并不依赖于对象。在类的外部不能调用类中的私有静态成员函数。

 

l 静态成员仍然遵循public,private,protected访问准则。

l 静态成员函数没有this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用。

l  非静态成员函数可以任意地访问静态成员函数和静态数据成员。

l  调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,当同一类的所有对象使用一个量时,对于这个共用的量,可以用静态数据成员变量,这个变量对于同一类的所有的对象都取相同的值。静态成员函数也是由同一类中的所有对象共用。静态成员函数只能调用静态成员变量和静态成员函数,访问非静态数据成员必须通过参数传递的方式得到一个对象名,然后通过对象名来访问。

 

结构体中静态变量的使用

结构体中允许有静态变量。比如

1

2

3

struct A {

 static int s_value;

};

但这里s_value只是一个变量声明,而不是变量定义,也就是说,只有上面一个结构体定义是不够的,因为你没有为s_value分配存储空间,这时候不能通过A::s_value来访问它。解决办法是:在某一个C++源文件中定义这个变量。

定义语句很简单:

1

int A::s_value = 0; //可以初始化为0,也可不初始化。因为是静态变量,所以是默认初始化为0的。

注意:不能在头文件中定义。如果在头文件中定义,一旦头文件被多个源文件包含,编译时一定会报“重定义”而导致编译失败的。变量定义语句要放在所有函数的外面。

如果同时使用了namespace,则定义时也要同时指明。例如:

//头文件里面声明

1

2

3

4

5

namespace mycode {

 struct A{

   static int s_value;

 };

}

//源文件里面定义

1

int mycode::A::s_value = 0;