您的位置:首页 > 其它

static关键字的作用

2016-04-06 15:45 309 查看

单例模式

1.静态变量和全局变量

在某函数体内的静态局部变量作用域为该函数体内,但是退出该函数时,该静态变量继续存在,但不能够被使用。

全局变量为整个程序所使用,静态全局变量只能在定义该变量的.cpp或.c文件中使用,不能被外部使用。

PS:同全局变量相比,使用静态数据成员有两个优势:

1. 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性;

2. 可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能;

2.C++中的类数据成员声明为static

对于非静态数据成员,每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员,无论定义多少个该类的对象,静态数据成员只分配一次内存,在程序中也只有一份拷贝,被所有类对象共享访问,而不是属于某个类对象。即,静态数据“成员唯一且共享”。静态数据成员主要用在各个类对象拥有某种共同属性的场合。无论创建多少类对象,都共享一份静态数据成员,节省存储空间,而且方便修改,比如银行存款类的利息可定义为静态数据,一旦利息需要改变,只需修改一次。

PS:静态数据成员的初始化和访问:

• 与一般数据成员初始化不同,静态数据成员是静态存储,必须对其初始化(定义),不然在链接时会报错,而且定义时要分配内存,因此静态数据成员必须在类内声明,在类外定义。静态数据成员初始化的格式为:

<数据类型><类名>::<静态数据成员名>=<值>

• 类的静态数据成员有两种访问形式:

<类对象名>.<静态数据成员名>或 <类名>::<静态数据成员名>

3.C++中的类函数成员声明为static

在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员,这样就出现以下作用:

(1) 类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据和静态成员函数。而非静态成员函数既可以访问普通成员数据,也可以访问静态数据成员。

(2) 静态成员函数不可为虚函数。为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志

(3) 由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊 ,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。

(4) 由于静态成员函数没有this指针,所以就差不多等同于nonmember函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: