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 将静态变量放哪里去了,追踪源码之后,看清楚了整个套路,总体上来说,可以举例来说对 ...
随机推荐
- 【idea激活码】,【WebStorm激活码】,【DataGrip激活码】,【IntelliJ 全家桶系列】,【定期更新】,【第一期】
IntelliJ IDEA.PyCharm.PhpStorm.WebStorm.RubyMide.AppCode.CLion.GoLand.DataGrip.Rider.Android Studio可 ...
- Python基础知识总结笔记(四)函数
Python基础知识总结笔记(四)函数python中的函数函数中的参数变量作用域偏函数PFA递归函数高阶函数BIFs中的高阶函数匿名函数lambda闭包Closure装饰器Decorator函数式编程 ...
- Django request对象与ORM简介
form表单 form表单默认是以get请求提交数据的 http://127.0.0.1:8000/login/?username=admin&password=123 action参数 1. ...
- iMacros 入门教程-内置变量介绍(5)
iMacros 的变量类型 1.!VAR0 到 !VAR9,这是系统定义的内置变量,专门给你赋值用 就是程序设定了这几个名字给你赋值 2.内建变量 就是 imacros 设定的特别作用的变量,例如 ! ...
- node post 大数据无响应超时
使用 express 框架,post 较大数据量(富文本,里面包含了图片base64数据,大约300k)时,node 无响应,把数据内容减少后能顺利提交. 是因为数据量大过body post 的限制导 ...
- cat - EOF标志的使用
前提 cat命令是用于连接文件并输出到标准输出设备或指定文件中. EOF为标志,可以替换为其他字符串 代码块 ``` 将文件内容作为标准输出也就是将文件内容输出到屏幕中,也可写作 cat filena ...
- Docker Compose搭建ELK
Elasticsearch默认使用mmapfs目录来存储索引.操作系统默认的mmap计数太低可能导致内存不足,我们可以使用下面这条命令来增加内存: sysctl -w vm.max_map_count ...
- 纪中9日T4 2298. 异或
2298. 异或 (File IO): input:gcdxor.in output:gcdxor.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 题目描述 Sarv ...
- LOJ6287 诗歌
题意 给定一个排列,问是否存在\(\forall a,b,a\neq b\)满足\(2|(a+b)\)且\(\frac{a+b}{2}\)在\(a,b\)间 做法 枚举中点\(a\),即需要存在类似\ ...
- Picture POJ - 1177 线段树+离散化+扫描线 求交叉图像周长
参考 https://www.cnblogs.com/null00/archive/2012/04/22/2464876.html #include <stdio.h> #include ...