static 类成员变量 和 static const类成员变量
1、使用static类的优点:
(1)避免与其他类的成员或者全局变量冲突
(2)可以封装
(3)阅读性好
2.static 数据成员独立于该类的任意对象而存在
static数据成员的类型可以是该成员所属的类类型。非static成员被限定声明为其自身类对象的指针或引用。
class Bar{
public:
//
private:
static Bar mem1; //ok
Bar *mem2;//ok
Bar &mem3;//ok
Bar mem4;//error 不能脱离类的对象而存在,不像static与对象无关
}
注意事项:
(1)用static可以为类类型的所有对象所共有,像是全局对象,但又被约束在类类型的名字空间中。
(2)可以实施封装,将其放在private或protected区域中。
(3)static成员没有this指针,它不是任何一个对象的组成部分,推荐用“类名::static成员名调用”。
(4)static数据成员声明时,写明static关键字,定义时不能加static关键字。而且,static数据成员必须要在类声明之外作定义。
(5)需要指出的是,尽管它不是任何一个对象的组成部分,但是类的成员函数可以直接访问static数据成员,可以通过类对象、类对象的引用、或者指向该类型的指针调用static类成员变量。例如:
class A
{
public:
static int m;
static void display(); // 声明
};
int A::m=0; // 定义
void A::display()
{
cout<<"m ="<<m<<endl;
}
void main()
{
A temp;
temp.display();
cout<<++temp.m<<endl;
}
但是当类中声明的static变量为private时,则只能通过类的作用域作用符调用,例如
class A{
private:
static int m;
static void display(); // 声明
};
int A::m=0; // 定义
void A::display(){
cout<<"m ="<<m<<endl;
}
int main(){
A::display(); // 通过作用域操作符::调用
}
3. static成员变量的初始化
static数据成员必须在类定义题的外部定义(正好一次)。不像普通数据成员,static成员不是通过类的构造函数初始化的,而是应该在定义时初始化(没有任何例外!!!)。在类定义体外部引用类的static成员时,必须指定成员是在哪个类中定义的。static关键字只能用于类定义体内部的声明中,定义时不能标示为static。
class A{
private:
static int m;
static void display(); // 声明
};
int A::m=0; // 定义
void A::display(){
cout<<"m ="<<m<<endl;
}
int main(){
A::display(); // 通过作用域操作符::调用
}
4. const static数据成员
1)static const 与const static是一样的,没有区别。
2)static const存储在静态存储区域,不可修改其值的常量,可用来替代define或enum
3)所有类型的变量都可以声明为static const,必须要在类定义体之外进行定义并初始化,只能在类定义体中进行声明。唯一的一个例外:对于整形类型(见《C++ Premier》P30页定义,包括int,bool,char,long等类型),则可以在类定义体中进行定义并初始化,但必须仍旧在类的定义体外进行声明。
[注解:上述这条针对const static 整形成员变量的规则,在VC6.0下编译会有问题,但这是编译器本身的缘故,在其他高版本的VS环境下编译没有问题。]
4)将变量声明为static const,是为了实际需要,为了设定一个在整个class范围内都不变的常量。
只要初始化式是一个常量表达式,整形const static数据成员就可以再类的定义体中进行初始化。
class Count{
public:
static double rate(){return interest_rate;}
static void rate(double);
private:
static const int period=30;
double daily_tbl[period];
};
const static 整形数据成员在类的定义体中初始化时,该数据成员仍必须在类的定义体之外进行声明:
const int Count::period;
static 类成员变量 和 static const类成员变量的更多相关文章
- C++中基于成员函数是否是const重载成员函数
C++pimer中文版第四版 378页 基于const的重载 如果我们要在一个类的成员函数中定义两个函数签名完全一样的成员函数,比如display,那么可以基于是否是const成员函数来重载.比如: ...
- 【C++】const,static和static const类型成员变量声明及其初始化
1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...
- C++ static、const和static const类型成员变量声明以及初始化
C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...
- C++之const类成员变量,const成员函数
const修饰类的成员函数 const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当co ...
- static数据成员与const数据成员的定义与初始化
三种数据类型的初始化 1.static int a 的初始化 const int a 的初始化 static const int a的初始化 三种初始化方式 在类外初始化 在构造函数中通过初始化列表初 ...
- 类里面的非static const成员
类里面的成员变量可以用const修饰,在只用const不用static修饰的情况下,这种使用的限制比较多 (1)不能定义处初始化,必须在类的构造函数初始化列表里面初始化(虽然在vs中,可以在定义处初始 ...
- static 成员变量、static 成员函数、类/对象的大小
一.static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量. 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量 ...
- java中的static(包括类前面修饰的static、方法前面修饰的static、成员变量前面修饰的static)
static是静态修饰符: 什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个 ...
- C++ —— 类中static和const关键字声明变量的初始化方式总结
在类中声明变量/常量时,经常会用到static.const关键字.对于该变/常量的初始化问题,网上有许多相关文章,但是大多不够完善,或者存在错误.经过实际验证,总结如下: (注明:测试编译平台为VS2 ...
随机推荐
- 【leetcode】Insert Interval(hard)★
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- java实现批量上传(swfupload)
下载 swfupload 文件夹 里面包含handlers.js,swfupload.js,swfupload.swf 三个文件. 我的是和ssh项目整合在一起的.因为struts2的拦截器会拦截所有 ...
- ios cell展示可滑动的图片
需求: 点击cell上的图片.图片以原图显示出来,可以放大或缩小.再次点击图片移除图片显示原来界面.(和QQ空间看图片类似) 点击图片实现效果: 1. 自定义一个 UITableView (KDIma ...
- NYOJ题目845无主之地1
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAskAAAKbCAIAAACIEYBGAAAgAElEQVR4nO3dvXKkPLe38X0Szn0gjv
- Linux(CentOS)系统下设置nginx开机自启动
Nginx 是一个很强大的高性能Web和反向代理服务器.下面介绍在linux下安装后,如何设置开机自启动.首先,在linux系统的/etc/init.d/目录下创建nginx文件,使用如下命令:vi ...
- Eclipse的各种快捷键
参考他人总结好的 Eclipse快捷键大全(转载) Ctrl+1 快速修复(最经典的快捷键,就不用多说了) ---->例如:add unimplement methodCtrl+D: ...
- javascript - 浏览器对象
Navigator对象 弹出窗口 Cookies Browser Objects 参考手册 参考手册描述了每个对象的属性和方法,并提供了在线实例. Window 对象 Navigator 对象 Scr ...
- 攻城狮在路上(叁)Linux(十八)--- 文件系统的简单操作
本篇仅作为补漏. 一.查看磁盘和目录的容量:df du df:列出文件系统的整体磁盘使用量. du:评估文件系统的磁盘使用量(常用于评估目录所占容量) 二.连接文件:ln 1.hard link:硬 ...
- JqueryDemoTools-用于整理jQueryDemo 分类: C# 公共资源 2014-12-02 16:50 224人阅读 评论(1) 收藏
应用背景: 在学习js时,为了熟悉某个功能,或使用某个插件,往往需要写一个Demo来测试:一些好的Demo也可以整理积累下来,方便以后查阅: 写了一个编写jQuery Demo的辅助工具.界面很简单, ...
- Oracle 【IT实验室】数据库备份与恢复之:如何对Oracle数据库文件进行恢复与备份
任何数据库在长期使用过程中,都会存在一定的安全隐患.对于数据库管理员来说不能仅寄希望于计算机操作系统的安全运行,而是要建立一整套的数据库备份与恢复机制.当数据库发生故障后,希望能重新建立一个完整的数据 ...