static成员变量,non-static成员变量,局部变量,global 变量作用域和生存周期
2016-07-03 20:19
513 查看
同一个类 | 生存周期 编译,运行.内存中创建. (编译的时候存在的变量,运行的时候存在的变量,堆栈是在代码段,内存泄露都是代码段) | 作用域/作用 | 定义(声明)/Init赋值/调用 |
成员变量 和 局部变量 | 在编译的时候只有static的成员变量 存在。 Non-static的成员变量和局部变量都是在运行的时候在存在的。 | 类中作用域: Local变量作用域是子函数。 成员变量相当于c的全局变量。 | 局部变量在局部函数定义,赋值和退出销毁。 成员变量见正下面的table |
Static成员变量 Non- Static 成员变量 | Static变量在编译的时候和类同时就存在了. 所有对象共享一份。 Non-static 变量在对象new出来的时候, 在构造函数中创建。 每个对象一份。 每个对象不同。 | 常用作用: Static变量可以统计有多少 个对象实际存在. 因为cascadeHdlrs数组 是static变量. Static CascadeHdlrEntry cascadeHdlrs [CASCADE_HDLR_NUMBER_OF_ENTRIES]; 所以其数组struct中data也是static的. (虽然pHldr 不是每个对象一份,但是这与它可以随便指向任何baseclass和更换不同的subclass没关系) | Static 成员变量在类外初始化.不能在函数内初始化.因为成员函数是在new出对象之后才有.而且每个对象一份。但是static在它之前就有了。所以在类外初始化在编译的时候就完成了初始化init。 初始化init要类直接调用的形式。 CascadeMgr* CascadeMgr::sInstance = NULL; Non static的成员变量在构造函数中初始化。 在函数中直接使用. |
Global 变量 | 和static变量一样,在编译的时候就存在了 | 可以跨对象,即每个对象都可以使用,这点与成员变量不同,成员变量仅仅是自己对象内使用. 成员变量每个对象自己一份。(类中的成员变量实际是模板定义,这个每个对象都有这个变量 .类不可使用成员变量,仅仅使用static变量 .对象给自己的成员变量赋值) | 在class 类外定义和初始化 |
思考角度站在high level从编译,运行角度看问题
下述概念摘自网络:
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
全局变量:也叫成员变量,是指在类中定义的变量;它在整个类中都有效
全局变量又可分为:类变量和实例变量
1.类变量:又叫静态变量 用static修饰 它可以直接用类名调用 也可以用对象调用 而且所有对象的同一个类变量都是共享同一块内存空间的
2.实例变量:不用static修饰 它只能通过对象调用 而且所有对象的同一个实例变量是共享不同的内存空间的
比如:成员变量不能按照static变量的使用方式使用,会报错
error C2597: illegal reference to non-static member 'CNetToolThread::m_bFtpConfigError'
2: {}作用域:can;t create memory forever, because {} is 作用域. when go out {} for one time , the string and int will disappear
while(1)
{
int a=1;
string a(1);
}
3 static 变量的调用
类和对象都可以调用
类::val
对象->val. 实现多个对象共享一个变量 ,多个对象调用的是同一个static variable
相关文章推荐
- 华为OJ——称砝码
- Android studio启动时总是在找AndroidSDK的解决办法
- linux中RAID详解
- 华为OJ——输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数
- VC与JavaScript交互(一) ———— 如何实现
- 【MFC入门】之三 标准控件在可视化编程中的应用之组合框控件
- 华为OJ——判断两个IP是否属于同一子网
- JavaScript 模式
- 非静态函数,非静态变量与静态函数,静态变量
- POJ 2234 Matches Game/hdu 1907 John(尼姆博奕中取完胜与取完负的模板)
- 华为OJ——求小球落地5次后所经历的路程和第5次反弹的高度
- 适用于并行计算的几个集合System.Collections.Concurrent 带锁
- 【网络流】hdu4940
- SCPPO(七):安全检测及分析神器—AppScan使用教程
- 华为OJ——统计每个月兔子的总数
- leetcode:Valid Sudoku
- Delphi for iOS开发指南(5):在iOS应用程序中使用Calendar组件来选择日期
- mysqltuner
- XHTML 列表与表格
- 华为OJ——字符串加密