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函数。
相关文章推荐
- 进入局域网d盘
- 团队项目成员和题目
- Java enum的用法详解
- 数据库表的最大值查询
- 团队开发--NABCD
- jquery学习之add()
- 激活窗体
- Android Studio Logcat显示不全问题
- Netty in Action (四)第一章节 第三部分 Netty核心组件
- 【笔记】 《js权威指南》- 第14章 Window对象 14.8 多窗口和窗体
- [置顶] 用 Java 实现断点续传 (HTTP)
- .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));知多少
- C++标准库之mutex
- aerospike 代码阅读
- Spring框架自动装配 Bean(三)
- 64位ubuntu编译32位程序
- 2016年我的学习记录与搜索到的网站,将持续更新,主要介绍我在公司应用ecshop的学习记录
- C# winform 打开新窗体 关闭当前窗体
- mvc 4 razor语法讲解和使用
- [BTS] The value "" for the property InboundId is invalid