存储持续性、作用域和链接性
作用域和链接性
- 作用域用来描述名称在文件的多大范围内可见,通常来说,在所有函数体外的声明作用域为文件,在函数或者结构内的声明作用域为此代码块内。
- 链接性描述了名称在文件间以何种方式共享,一般来说,内部链接的声明只在此文件可以使用,外部链接的声明可以在文件间共享,没有链接性的声明不能共享。
和C语言对于这部分的叙述差不多,当初已经笔记过一次了,就只写一些不同
C++11中的auto
在C++11中,auto用于自动推断类型,而在C语言和C++以前的版本中,则只是显示的指出变量为自动存储
寄存器变量
在C语言和C++以前的版本中,register变量用于请求寄存器变量,即建议编译器使用CPU寄存器来存储变量,但是C++11之后,它的作用只剩下了用来显式的指出这个变量是自动变量。
static的两种用法
- 在代码块内使用,表示没有链接性的具有静态持续性的自动变量,在代码块内除了第一次执行会声明或者初始化这个变量,之后再次执行这个语句时不会再次声明或者初始化,而是使用之前声明所分配的地址,这个地址在第一次离开代码块时不会被释放。
- 在任何函数外的变量声明前添加,表示具有内部链接的静态持续性的作用域为本文件的变量,本文件内(自声明后)的任何地方都可以使用这个变量。
关键字extern的应用
对于在任何函数体外声明的变量,并且在前面没有关键字static
,那么他们是具有外部链接的作用域为整个工程的静态持续性的全局变量。
可以在变量声明前添加关键字extern
,如果是初始化式声明,那么将视为创建了一个新的变量,如果只是声明而不进行初始化,那么是引用式声明,表示使用其他文件已经声明的全局变量。
关于变量隐藏的小结
简单来讲就是,如果声明的变量和上一级有同名的,那么将隐藏上一级的同名变量定义。
比如说局部变量隐藏全局变量等等。
volatile关键字
此关键字用于变量声明前,告诉编译器不要对对代码进行优化。
mutable关键字
可以由这个关键字来指出,即使结构或者类变量被const限定了,它的某一个成员也是可以被修改的。
const关键字的其他属性
在C++而非C语言中,const限定符对变量的默认存储类型稍有影响,在默认情况下全局变量的链接性为外部的,但是在添加const
限定符后,将变为内部链接,可以再在前面使用extern
声明再将变量变为外部链接的。
函数的链接性大致和变量差不多。也可以使用static和extern声明,也会覆盖上一级定义等等。
语言链接性
new的使用和属性
使用new运算符进行初始化
int *ps=new int(5);
double *pr=new double [2]{1,2};
char *pn=new char{'a'};
在使用new运算符时可以进行初始化,在后面跟()或者{}即可,小括号用于单个变量的初始化,大括号可以用于单个变量的声明也可以用作数组的初始化。
new失败时
new可能请求不出来内存,这时候会出错,在之前会返回空指针,现在会引发异常std::bad_alloc。
定位new运算符
在使用new时后面跟上小括号,小括号内写入一个char类型数组的指针,可以指定使用这一块内存来为指针分配内存。
char name[512];
int *ps=new (name)int(666);
int *pr=new(name)int[40];
![](https://img-blog.csdnimg.cn/f76ee348949e46978bcec0a7c79aaf9d.png)