C++之易混淆知识点一-----static详解
1、const、mutable与volatile的区别:
const表明内存被初始化以后,程序将不能对它进行修改。
volatile则表明,即使程序代码没有对内存单元进行修改,但是里面的值也可能会发生变化,是一种意想不到地被改变。例如:将一个指针指向某个硬件位置,其中包含了来自串行端口的时间和信息,在某些情况下,硬件而不是程序可能会修改其中的内容,或者两个程序可能相互影响,共享数据。该关键字的作用就是为了改善编译器的优化能力。假设编译器发现程序在几条语句中两次使用某个变量的值,则编译器可能不是让程序查找这个编码的值两次,而是将这个值缓存到寄存器中。这种优化假设变量的值在这两次使用之间不会发生变化。如果不将变量声明为volatile,则编译器将进行这种优化,否则,相当于告诉编译器,不要进行这种优化。比如:状态寄存器、多线程中几个任务共享一个变量等情况下使用volatile。
mutable表明即使结构或者类变量为const,其某个成员也可以被修改。例如:
struct data
{
char name[20];
mutable int access;
}
const data vari={"mutalble usage",0};
strcpy(vari.name,"abcederj"); //not allowed
vari.access++; //allowed
2、静态变量在整个程序执行期间都存在。
a、对于在函数外面定义的变量:其所属文件中位于该变量的定义后面的所有函数都可以使用它(文件级的作用域),并可在程序的其他文件中使用(外部链接性),而且另一个文件如果要使用这个变量,必须使用extern关键字来声明它。
b、对于文件共享的变量,应该在一个文件中不使用extern来包含其定义声明,并且在其他文件中使用extern来包含引用声明。
c、在函数的外面使用static定义的变量,其作用域是整个文件,具有内部链接性,即不能用于其他文件。
d、在代码块中定义的static变量,作用域是该代码块,即具有局部作用域和无链接性,但是在整个程序的执行期间,它都一直存在并且保持原来的值。
e、C++的函数默认为外部连接性,因此可以在文件之间共享,但是使用关键字static限定的函数的链接性是内部的,只在定义的文件中使用,而不能在其他的文件中使用。
所以,总结static的用法和区别如下:
一、static全局变量和普通全局变量的区别:(改变作用域,不改变生存期)
在全局变量(外部变量)的说明之前加上static就构成了静态的全局变量。全局变量本身就是静态的存储方式,静态的全局变量当然也是静态存储方式,二者在存储方式上没有区别。其主要区别就在于:非静态全局变量的作用域是整个程序,当一个程序是由多个源文件组成时,非静态全局变量在各个文件中都是有效的;而静态全局变量则限制了作用域,也就是只在定义该变量的文件中有效,而在同一个程序中的其他文件中不能使用。由于静态的全局变量的作用域局限于一个源文件中,只能为该文件的函数公用,因此可以避免在其他源文件中引起错误。static全局变量只初始化一次,以防止在其他文件单元中被引用。
二、static局部变量和普通局部变量的区别:(改变生存期,不改变作用域)
将局部变量改成static变量后,改变了其变量的存储方式,即改变了变量的生存期。将全局变量改成static变量后,不改变其变量的存储方式,即不改变变量的生存期,改变了变 量的作用域。static局部变量只初始化一次,下一次保持上一次的结果值。
三、static函数和普通函数的区别:
static函数和普通函数的作用域不同,只在当前文件中使用的函数应该说明为static,即只在本文件中进行说明和定义。对于可在当前文件以外使用的函数,则应该在一个头文件中进行说明,若要使用这些函数的源文件就需要包含这个头文件。static函数在内存中只有一份,而普通函数在每个被调用中维持一份拷贝。
3、在C++中,char数组名、指向char的指针和用引号括起来的字符串常量都被解释为字符串的第一个字符的地址。
C++之易混淆知识点一-----static详解的更多相关文章
- Java-web易混淆知识点整理
Java-web易混淆知识点 post和get区别 post: 数据不会显示在地址栏 安全 大小无限制 可以提交二进制文件 get: 数据显示在地址栏 不安全 get方式提交有大小限制(约4kb) 相 ...
- php易混淆知识点
一.define(“constant”, “hello world”);和const constant = “hello world”;的区别? (0).使用const使得代码简单易读,const本 ...
- C++易混淆知识点整理
// 1 /////////////////////////////////////////////////////////////////////// // 常量指针:,指针可修改,变量不可修改(只 ...
- CSS易混淆知识点总结与分享-定位与布局
CSS定位有四种模式:static.relative.absolute.fixed,其它static是默认值,下面分别讲解下各自的特点: static:静态定位,处于动态布局流中,按照页面中的各元素先 ...
- 【PMP】易混淆知识点
一.混淆概念 德尔菲技术 德尔菲技术是组织专家达成一致意见的一种方法.项目专家匿名参与其中.组织者使用调查问卷就重要的项目议题征询意见,然后对专家的答卷进行归纳,并把结果反馈给专家做进一步评论.这个过 ...
- C语言之数组与指针的易混淆知识点
一.指针与数组 指针:指针本身也是一个变量,它的内容是指向的内容的地址.指针同样有类型的区分,char 的指针只能指向char型数据,int 指针指向int型数据.但是指针所占内存单元的大小(即其内容 ...
- C++之易混淆知识点二
1.数据抽象与封装 数据抽象是一种接口和实现相分离的编程技术,设计者关心的是如何实现这些接口,而使用者仅仅知道这些接口,抽象地考虑这些接口做什么的就可以了,不必去考虑如何实现这一层次. 封装是将低层次 ...
- mysql易混淆知识点
1,join 和 union join连接属于表之间的水平操作,而union 是表之间的垂直操作.简单讲就是水平操作主要是为了获得列数据,垂直操作是为了获得行数据 cross join ...
- JavaScript易混淆知识点小回顾--数组方法与字符串方法;
数组属性: arr.length;查看数组的长度 arr.Pop;删除数组最后一个元素; 数组的方法: arr.push();添加到数组末端; arr.shift();删除数组的第一个元素; arr. ...
随机推荐
- 通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部
本文将以宿主上直接写文件到VM内部为例讲解为何要注入以及如何实现 tag: qemu-ga, qemu guest agent, kvm, guest-file-write, inject 小慢哥的原 ...
- ios中去除tableView的分割线
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
- SVN——Jenkins自动发布
最近公司项目处于开发阶段,很多功能开发完后就需要发布到测试环境等待测试去验收,这个时候如果手动更新网站的话,是很费时费力的. 于是乎,我们做成了自动发布,这样我们只管提交代码到SVN就行了,发布由软件 ...
- iOS 11 APP 设计中的几个 UI 设计细节
Apple 官网看了 iOS 11 的介绍,发现有不少的更新哦,比如控制中心.Siri.Live Photo 等等,总体来说都有很多不错的体验,不过本文不介绍功能,只说视觉界面. 在 iOS 11 的 ...
- 自己写的PHP的mql类
用类封装的一个数据库的操作,不仅安全,而且会省去很多代码. header('Content-type:text/html;charset="utf-8"'); class mysq ...
- CodeForces-366C Dima and Salad 对01背包的理解 多个背包问题
题目链接:https://cn.vjudge.net/problem/CodeForces-366C 题意 给出n个水果和一个常数k,其中每个水果都有两种性质ai, bi(美味度,卡路里量). 要保证 ...
- 一般树--common tree
参照libyang中的lyd_tree的组织结构,写了一套通用树接口. github 的地址:https://github.com/HellsingAshen/mytc/tree/master/tc_ ...
- 原生JS封装ajax以及request
一.封装原生的xhr为ajax类 xhr以及用法见之前的文章 1.根据url确定请求的头部以及别的信息. var _headerConfig = {}; if(url.indexOf('getcapt ...
- 解决locate无法使用的问题
使用yum安装,locate的安装包名为mlocate 安装: yum -y install mlocate 更新: updatedb 无法使用:先下载
- NYIST 677 碟战
碟战时间限制:2000 ms | 内存限制:65535 KB难度:4 描述知己知彼,百战不殆!在战争中如果被敌人掌握了自己的机密,失败是必然的.K国在一场战争中屡屡失败,就想到自己的某些城市可能会有敌 ...