C++ 存储持续性、作用域和链接性

存储持续性、作用域和链接性

作用域和链接性

  • 作用域用来描述名称在文件的多大范围内可见,通常来说,在所有函数体外的声明作用域为文件,在函数或者结构内的声明作用域为此代码块内。
  • 链接性描述了名称在文件间以何种方式共享,一般来说,内部链接的声明只在此文件可以使用,外部链接的声明可以在文件间共享,没有链接性的声明不能共享。

和C语言对于这部分的叙述差不多,当初已经笔记过一次了,就只写一些不同

C++11中的auto

在C++11中,auto用于自动推断类型,而在C语言和C++以前的版本中,则只是显示的指出变量为自动存储

寄存器变量

在C语言和C++以前的版本中,register变量用于请求寄存器变量,即建议编译器使用CPU寄存器来存储变量,但是C++11之后,它的作用只剩下了用来显式的指出这个变量是自动变量。

static的两种用法

  1. 在代码块内使用,表示没有链接性的具有静态持续性的自动变量,在代码块内除了第一次执行会声明或者初始化这个变量,之后再次执行这个语句时不会再次声明或者初始化,而是使用之前声明所分配的地址,这个地址在第一次离开代码块时不会被释放。
  2. 在任何函数外的变量声明前添加,表示具有内部链接的静态持续性的作用域为本文件的变量,本文件内(自声明后)的任何地方都可以使用这个变量。

关键字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];
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_南明_离火_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值