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 将静态变量放哪里去了,追踪源码之后,看清楚了整个套路,总体上来说,可以举例来说对 ...
随机推荐
- hive内置方法一览
引用 https://www.cnblogs.com/qingyunzong/p/8744593.html#_label0 官方文档 https://cwiki.apache.org/confluen ...
- ext4文件系统启动自检的必要性
最近我们发现多个用户设备掉电后重启,系统不工作. 研究这些返修设备,发现这些设备的表象是网络连接失败,DNS resolve不了.进一步发现/etc/resolv.conf为空,所以应用程序没法进行D ...
- Spring cloud微服务安全实战 最新完整教程
课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...
- P2919 [USACO08NOV]守护农场Guarding the Farm
链接:P2919 ----------------------------------- 一道非常暴力的搜索题 ----------------------------------- 注意的是,我们要 ...
- Tutorial: Publishing additional services for printing
Complexity:IntermediateData Requirement:Use your own data There may be occasions when you need to pu ...
- pycharm导入python包
总步骤:file --> settings --> poject interpreter --> 点击加号 --> 搜索需要导入的python包 --> 选中需要导入的p ...
- Spark学习之路 (二十八)分布式图计算系统[转]
引言 在了解GraphX之前,需要先了解关于通用的分布式图计算框架的两个常见问题:图存储模式和图计算模式. 图存储模式 巨型图的存储总体上有边分割和点分割两种存储方式.2013年,GraphLab2. ...
- 手写mybatis框架笔记
MyBatis 手写MyBatis流程 架构流程图 封装数据 封装到Configuration中 1.封装全局配置文件,包含数据库连接信息和mappers信息 2.封装*mapper.xml映射文件 ...
- 关于MySQL数据库中null的那些事
在mysql数据库中,null是一个经常出现的情况,关于mysql中的null,有哪些注意事项呢?下面简单总结归纳下,后续会不断补充. 1. is null 首先判断数据库中某一列的值是否为null, ...
- 从首个IMO季军谈起 作者 : 付云皓
刚刚过去的IMO,中国史无前例地获得了第三名,也是自1997年来近20年首次跌出前二.感谢微信等社交软件,相信现在这个新闻已经以火箭的速度传播了. 作为一个与数学竞赛及IMO打了多年交道的人,我一直有 ...