前文已更新完const、static、new、delete关键字,今天来更新最后一期,包含sizeof运算符、ertern、volatile、mutable、explicit、final、enum、auto。部分关键字为常考笔试题与面试题噢,一起来学习一下吧~
const关键字C++学习——const关键字-CSDN博客
static关键字C++学习——static关键字-CSDN博客
new、delete关键字C++学习——new delete关键字-CSDN博客
一、sizeof
1.1 sizeof和strlen的区别
1、sizeof是一个运算符,strlen 是库函数。
2、sizeof计算的是数据类型占内存的大小,而 strlen 计算的是字符串实际的长度,不包括字符串结束符.
3、sizeof的参数可以是数据类型,也可以是变量,而 strlen 只能以结尾为’\0’的字符串作参数。
4、编译器在编译时就计算出了sizeof 的结果, strlen 函数必须在运行时才能计算出来。
5、数组做sizeof的参数不退化,若指定数组长度,则结果与元素个数无关,总字节数=数组长度*sizeof(元素类型),若没有指定长度,字符数组为实际字符串长度+1,整型数组为实际元素个数。
数组传递给strlen就退化为指针。
举例:
1.2 sizeof计算
(1) 基本数据类型字节长度
char(1),short(2),int(4),long(4),float(4),double(8)括号内为实际所占字节数;
32位操作系统指针大小为4字节,64位指针为8字节,与指针类型无关;
一个空类占1个字节,虚继承涉及到虚指针占4个字节;
(2) 结构体对象的长度
在默认情况下,为方便对结构体内元素的访问和管理。当结构体内元素长度小于处理器位数的时候,便以结构体内最长的数据元素的长度为对齐单位,即为其整数倍。
若结构体内元素长度大于处理器位数则以处理器位数为单位对齐。
(3) 无符号类型unsigned影响的只是最高位的意义,数据长度不会改变,
因此sizeof(unsigned int)=4
1.3 sizeof注意事项
1、自定义类型的sizeof取值等于它的类型原型取sizeof
2、对函数使用sizeof,在编译阶段会被函数的返回值类型代替
3、由于sizeof是运算符,因此如果sizeof后是数据类型名则必须加括号,变量名可以不加括号.
4、sizeof不计算static变量占的内存。
5、不能返回动态数组或者外部数组的尺寸。
二、ertern
2.1 ertern
extern:声明“外部”定义的全部变量和函数。
extern声明的函数和变量可以在本模块或其它模块中使用,编译器遇到此变量和函数时可在其它文件中寻找定义。
2.2 ertern "C"
主要作用就是为了能够正确实现C++代码调用其它C语言代码,加上后,会指示编译器这部分代码按C语言的方式进行编译,而不是C++。
原因:由于C++支持函数重载,因此编译器编译函数的过程中会将函数名和参数类型也加到编译后的代码中,而C语言不支持函数重载,编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。
三、volatile
3.1 volatile关键字
volatile 关键字是一种类型修饰符,被设计用来修饰被不同线程访问和修改的变量,提供对特殊地址的稳定访问
原因:在程序运行过程中有一些变量可能会被莫名改变,编译器为节约时间,有时候不会重读这个变量的真实值,而是去读在寄存器的备份,变量真实值反而被优化器给“优化”掉了。
语法:int volatile vInt;
当使用volatile声明变量时,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据,读取的数据立刻被保存,而不是使用寄存器里的备份。
volatile用处:
(1)中断服务程序中修改的供其它程序检测的变量加volatile;
(2)多任务环境下各任务间共享的标志应该加volatile;
(3)存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
3.2 变量可以由const和volatile同时修饰吗?
可以。
当使用const和volatile同时修饰变量时,表示这个变量在程序内部是只读的,只在程序外部条件变化下改变,并且编译器不会优化这个变量。每次使用这个变量时,都会小心地去内存读取这个变量的值,而不是去寄存器读取它的备份。
四、mutable
在const成员方法中想修改一个成员变量的值,使用mutable修饰
五、explicit
explicit:声明为explicit的构造函数不能使用隐式转换。
六、final
在类名称后面使用final,意味着继承该类会导致编译错误;
将方法标记为final,这意味着无法在子类中重写该方法。
用途:阻止了类继承、阻止虚函数的重载。
七、enum
enum:定义枚举类型
可根据需要自定义整型值,第一个定义的 enum 值默认为 0 ,默认自增加 1。
八、auto
auto关键字是C语言中局部变量的默认的关键字,表明被修饰的关键字将被存储在栈空间上。
关键字完结撒花,期待下一次更新吧~如果有问题还请及时联系我!