static静态不是很静
在类中定义变量时,不会开辟存储空间,只有类定义一个对象时才会开辟类中成员变量的内存空间,且建立一个对象开辟一次,大小与类中的成员变量及函数有关。而static在静态区开辟内存空间,不占用内存空间。
1.函数内部的静态变量
在程序运行时,我们有时候希望一个变量的值在函数两次调用时他能分别保持上一次运行的结果,而不是每次调用都初始化为初值,实现这样的效果可以通过定义一个全局变量来实现,但是这个全局变量不仅这个函数可以使用,别的函数同样也可以改变它的值,不能完全保证只受一个函数控制,但是,如果在函数内部定义一个static变量,这个变量存储在静态数据区,而不是堆栈中,这个变量只在函数第一次调用时初始化一次,以后它将在两次函数调用之间保持它的值。
2.函数内部的静态对象
在类中,用户自定义类型,必须用构造函数初始化。因此,如果在定义一个静态对象是时没有指定构造函数参数,这个类必须有默认的构造函数。
class X{
int i;
public:
X(int ii = ) : i(ii) { }//默认构造函数
~X();
};
void f()
{
static X x1();//有参构造i=47;
static X x2;//调用默认的构造函数i=0;
}
int main()
{
f();
//程序调用f()时,只有第一次调用才需要执行构造函数,即只初始化一次。
}
3.控制连接
有时候想让一个变量在文件范围内是可见的,这个文件内的所有函数都可以使用它,但不想让这个文件之外的函数看到或访问该变量,不与外部标识符冲突。就可以使用sataic在.cpp中来限制变量,这样,这个变量只局部与该单元,在其它翻译单元中可以使用同样的名字而不会冲突。
4.定义静态数据成员
在类的数据成员中如果是静态常量(static const)可以在类内提供定义赋值初始化,但是对于全部类型的数组(即使是静态常量数组)必须为其提供专门的外部定义。
class WithStatic
{
static int x;//在类中声明,实现中定义(是静态,但非常量),类的静态数据成员有单独的存储空间,不管产生了多少个对象。
static int y;
static const int scsize[ ];// 静态数组必须在类的内部声明,实现中定义赋值初始化,
static int sxsize[ ];//不能在声明时定义初始化。;
static const int z=;// 静态常量可以在类中声明时定义初始化,
static const int w; //也可以类中声明,实现中定义初始化。
Public:
void print() const
{
cout << x << endl;
cout << y << endl; } }; int WithStatic::x = ;
//定义必须出现在类的外部,且只能定义一次,最终使用由类的构造者控制
int WithStatic::y = ;
const int WithStatic::scsize[ ] = { ,,,};
//数组的定义也只能在类的外部实现。
int WithStatic::sxsize[ ] = { ,,,};
const int WithStatic::w=;//常量也可以在类的外部实现。 int main()
{
WithStatic ws;
ws.print(); }
5.静态成员函数
像静态数据成员一样,静态成员函数为类的全体对象服务,而不是某个特殊对象的专属,这样就不需要定义一个全局函数,而是移到了类的内部起到到全局的作用。静态成员函数一般用类域(类名::函数名())去调用,从概念上体现静态成员函数为整个类所有。
class X
{
Public:
static void f();
}; int main()
{
X::f();
//静态成员函数可以自我调用,加上作用域限制符即可。它同样也可以由类的对象.或->去调用,但是普通成员函数只能通过对象调用。
}
静态成员函数不能访问一般的数据成员(没有默认的this指针),只能访问静态数据成员,也只能调用其他的静态成员函数。
class X
{
int i;
static int j;
public: X(int ii = ) : i(ii)
{
j=i;
} int val() const { return i;} static int incr()
{
i++;//非法访问,i不是静态变量。
j++;//正确
return j;
} static int f()
{
val();//非法,val()不是静态函数。
return incr().
} }; int X::j = ;//定义初始化 int main()
{
X x;
X* ip = &x;
x.f();
ip->f();
X::f();
}
static静态不是很静的更多相关文章
- C#中static静态变量的用法
使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员static修饰符可用于类.字段.方法.属性.运算符.事件和构造函数,但不能用于索引器.析构函数或类以外的类型 静态全局变量 定义 ...
- [转] C# 中的static静态变量
logitechyan原文关于C#中static静态变量 C#静态变量使用static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量,在对象被 ...
- 关于C#中static静态变量
C#静态变量使用static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问一个类的所有实例的同一C#静 ...
- C#中的static静态变量的用法
静态全局变量 定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量. 特点: A.该变量在全局数据区分配内存. B.初始化:如果不显式初始化,那么将被隐式初始化为0. 静 ...
- Java 基础之 static 静态
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...
- static{}静态代码块与{}普通代码块之间的区别
先看一个例子: //class A package com.my.test; class A { static { System.out.println("A1:父类静态代码区域" ...
- 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第6节 static静态_15_静态代码块
static的特殊用法, 静态代码块 加上构造方法,做测试 又创建一个对象 静态代码块 只执行一次 后续在学习jdbc的时候,静态代码块很有用途.
- jvm源码解读--09 创建oop对象,将static静态变量放置在oop的96 offset处 第二篇
先打断点systemDictionary.cpp 1915行 Universe::fixup_mirrors(CHECK); 进入 void Universe::fixup_mirrors(TRAPS ...
- jvm源码解读--08 创建oop对象,将static静态变量放置在oop的96 offset处
之前分析的已经加载的.Class文件中都没有Static 静态变量,所以也就没这部分的解析,自己也是不懂hotspot 将静态变量放哪里去了,追踪源码之后,看清楚了整个套路,总体上来说,可以举例来说对 ...
随机推荐
- 关于Redis缓存预热的思考
系统上线时,提前将相关的缓存数据直接加载到缓存系统.避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题. 这里我考虑2个问题: A.哪些数据需要预热? B.如何预热? 关于问题A,根据不同的业 ...
- Android进程永生技术终极揭秘:进程被杀底层原理、APP应对技巧
1.引言 上个月在知乎上发表的由“袁辉辉”分享的关于TIM进程永生方面的文章(即时通讯网重新整理后的标题是:<史上最强Android保活思路:深入剖析腾讯TIM的进程永生技术>),短时间内 ...
- 发布到IIS的php网站,所有的页面打开都是空白,目录权限问题,已解决
查了下,html可以打开,百度下原因,是网站目录没有写权限所致,修改下权限正常显示
- switch 语句 总结笔记
1.switch 语句 语法: switch(expression) { case value1 : statement1; break; case value2 : statement2; brea ...
- Enityt模型特性
数据验证相关的数据注解: 特性 解释 Remote 使用 jQuery 验证插件远程验证程序的特性 FileExtension 验证文件扩展名 Compare 比较两个属性的值 RegularExpr ...
- js中的节点遍历+类数组对象
firstChild 第一个子元素 lastChild 最后一个子元素 childNodes[n] = childNodes.item(n) 第n+1个子元素 parentNode ...
- exp导出含有双引号的表
由于ORACLE默认的表名都是不区分大小写,在创建表时,在数据字典中存储的表名为大写.在有些情况下,如果创建的表在表名上加上双引号("),则创建的表其表名在数据字典中不作转换.比如 SQL& ...
- ES6数组去重方法
Set实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员),操作方法有:add(value).delete(value).has(value).clear():遍历方法有:keys ...
- Swagger2 @ApiIgnore注解忽略接口在swagger-ui.html中显示
果项目中定义了一个controller,但是我们又不想把这个接口在swagger-ui.html中体现出来怎么办?不要着急,Swagger2已经替我们想到了这个问题,只要把@ApiIgnore放到你想 ...
- 一.pycharm配置Pyqt开发环境
1.安装pyqt pip install PyQt5 pip install PyQt5-tools 2.配置pycharm 2.1 配置QtDesigner Qt Designer 就是一个前端界面 ...