Static in C++
Static in C++
static根据上下文会有两种含义,他们的区别如下
- **在类class或者是在结构体struct 外 **使用static
- 类外的static修饰的符号在link阶段是局部的
 
- **在类class或者是在结构体struct 内 **使用static
- 若在类内或结构体内使用,则代表这个部分内存是这个类的所有实例共享的,简单来说,就算你实例化了很多次这个类或者结构体,但那个静态(static)变量只会有一个实例(有点全局变量的味道在里面了)
 
当static在类外
在类外使用static的含义是它表示这个变量or函数在link的时候只在这个编译单元(.obj)里可见!。
static变量或函数表示在link到它实际的定义时,linker不会在这个编译单元(.obj)外面找它的定义(这有点像class里面声明私有成员,其他的编译单元不能访问static修饰的变量)
一个我不懂的点:前缀
extern是用来强制声明一个变量or函数的,extern A表明A在其他编译单元(or其他地方)有过定义了,让编译器别慌,直接用就对了,属于是强制声明
总结一点来说:在类外用static,这意味着,你定义的函数和变量只对它声明所在的cpp文件(编译单元)是“可见"的
具体的应用是:可以在头文件里写变量和函数,然后用static做前缀,这样子在两个cpp文件里同时包含该头文件时就不会出错,毕竟#include的原理就是复制粘贴。更具体的应用场景可以参考在类中用私有成员时的场景,基本上static用的越多越好,如果不想让变量全局可见的话(毕竟全局可见其实是相当痛苦的事情,很容易一个cpp影响一堆cpp,导致各种奇怪的bug,所以并不赞同使用全局变量)
故使用重点是:尽量让全局函数和变量使用static标记,除非它们必须要用在其他编译单元里(两个编译单元做联动)
当static在类内
- 在类内用 - static修饰变量or函数的含义:在这个类的所有实例中,这个变量or函数只有一个实例- 可以理解成类内的全局变量,在一个实例中改变了static修饰的变量,则这个改变会体现在所有实例中,因为这个变量只有一个,即使建立了很多实例,所以通过类实例引用静态变量是没意义的,因为这就像是这个类的全局实例 
- class example {
 static int a = 1;
 };
 int main()
 {
 example A;
 //std::cout << A.a; 这里就是引用a,其实是没有意义的
 //完全等效于:
 std::cout << example::a; //甚至都不需要实例就可以直接调用!!!
 return 0;
 }
 
- 静态的方法(函数)亦如此,静态方法不通过类的实例就可以调用(使用类名加 - ::就可以访问),在静态方法的内部也无法访问到类的实例
 
- 当static在- if,for或函数等局部作用域内- 相当于把修饰的东西的生命期变成永久(所谓的静态),在离开作用域后并不会被系统自动回收内存,而是一直保留
- 虽然生命期长了,但是作用域仍然不变!,比如在函数A中定义static x,则变量x不能从函数A外调用,只能在函数A内使用!
 
Static in C++的更多相关文章
- static,你还敢用吗?(二)
		为了压系统,昨天小组在测试环境模拟了一大批订单数据.今天上午查看记录的账单计息日志,发现了一大堆的MySqlException MySql.Data.MySqlClient.MySqlExceptio ... 
- const,static,extern 简介
		const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ... 
- const extern static 终极指南
		const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ... 
- PHP static静态属性和静态方法
		这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ... 
- static,你还敢用吗?
		我用火狐的HttpRequester测试开发组里一个同学发布的Web API接口,遇到了一个奇怪的问题. 我测试边界情况时,第一次调用响应的结果是正常的,但当再次及以后的请求时,却返回了异常“Syst ... 
- Java关键字:static
		通常,当创建类时,就是在描述那个类的外观和行为.只有用new创建类的对象时,才分配数据存储空间,方法才能被调用.但往往我们会有下面两种需求: 1.我想要这样一个存储空间:不管创建多少对象,无论是不创建 ... 
- Android 中关于static的使用问题
		转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5251564.html 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错.初步排除了oom ... 
- iOS: 在UIViewController 中添加Static UITableView
		如果你直接在 UIViewController 中加入一个 UITableView 并将其 Content 属性设置为 Static Cells,此时 Xcode 会报错: Static table ... 
- 浅谈Static关键字
		1.使用static关键字声明的属性为全局属性 未使用static关键字指定city之前,如果需要将Tom,Jack,Mary三人的城市均改成Beijing,需要再次声明三次对象的city为Beiji ... 
- 今天思考一个问题,PHP const和static的区别
		static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心 ... 
随机推荐
- tensorflow源码解析之common_runtime-graph_optimizer
			目录 核心概念 graph_optimizer function optimization_registry 1. 核心概念 本篇主要讲图的优化迭代器.我们在构建原始图的时候,专注于达到目的,但不会去 ... 
- 打靶笔记-03-vulhub-Moriarty Corp
			打靶笔记-03-vulhub-BoredHackerBlog 一.靶机信息 Name: BoredHackerBlog: Moriarty Corp(中-高级难度) Date release: 29 ... 
- 29 面向对象编程 static 关键字
			补充:static 代码 // static public class Student{ private static int age; // 静态的变量 多线程 private double sco ... 
- 那些年踩过的坑---java篇
			事务 Transaction rolled back because it has been marked as rollback-only 问题描述:项目使用的是springboot,在代码中未使用 ... 
- VuePress 博客之 SEO 优化(三)标题、链接优化
			前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 本篇讲讲 ... 
- python链接mqtt订阅与发布
			什么是mqtt: MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的"轻量级"消息协议.该协议构 ... 
- 嵌入式linux驱动开发 笔记
			@ 目录 首个驱动hellodrv 1.编写源码 2.编译模块 3.加载驱动 首个驱动hellodrv 3.如果下载不到,就自己编写,并编译驱动. 1.编写源码 2.编译模块 1.先写makefile ... 
- python 发送GET请求
			# #博客地址:https://blog.csdn.net/qq_36374896 # 特点:把数据拼接到请求路径的后面传递给服务器 # # 优点:速度快 # # 缺点:承载的数据量小,不安全 imp ... 
- docker-compose + nginx部署前后端分离的项目
			安装docker 安装必要的系统工具 # 更新yum工具 yum update -y # 安装必要的工具 yum install -y yum-utils device-mapper-persiste ... 
- 面试问题之计算机网络:HTTP和HTTPS的区别
			https://blog.csdn.net/qq_38289815/article/details/80969419 
