C++ const、static等常用关键字解释

1.static关键字
修饰全局变量时,会将变量的链接属性变为内部链接属性,并且变量
的存储位置变为全局静态区;
修饰 局部变量,改变局部变量的存储位置为静态存储区,改变局部变
量的生命周期为整个程序开始到结束;
修饰类的成员变量和函数:属于类而不属于对象,属于所有实例类;
在这里插入图片描述
在这里插入图片描述

2.const关键字
修饰全局变量:C/C++略有不同,即C++的const修饰的全局变量可以作为属组的初始化的大小,而C不可以;同时变量的值不能被修改;C++利用const的这一属性,代替C中的define进行全局常量的定义;扩展_4会就 define,const,inline进行对比和分析;
修饰局部变量:代表局部变量的值不能被修改;
修饰指针:这个是经常问道的,我举的例子可能不全面,但是是比较
常见的例子:
cons t int *p; //修饰的是p所指向的内容不能被改变,p可
以;
int const p; //和上面是一样的;
int
const p; //修饰的p指针不能改变;
修饰类的成员变量:必须在初始化列表初始化,除此之外,必须在初
始化列表初始化的还有,引用类型的数据成员,没有默认构造函数的
对象成员,如果存在继承关系,如果父类没有默认的构造函数,则也
必须在初始化列表中被初始化,初始化列表对数据成员的初始化顺序
是按照数据成员的声明顺序严格执行的;
修饰类的成员函数:一般放在成员函数的最后面,修饰的是类的成员
函数中的隐藏参数this指针,代表不可以通过this指针修改类的数据
成员,声明形式例如:
Base::void fun() const;
关于const还有一个问题就是传参和赋值的问题,一般来说,const
修饰的变量是安全的,没有const修饰的变量是不安全的,一般在传
参的时候,非const修饰的的变量可以传给const修饰的,而const
修饰的不可以传给非const修饰的形参,这就相当于把安全的东西交
给了不安全的人;而赋值的话更不用说了,const修饰的不可以传给
没有const修饰的变量;

3.volatile关键字
volatile一般修饰变量,而它存在的原因是因为,我们的程序在进行
编译的时候,编译器会进行一系列的优化,比如,某个变量被修饰为
const的,编译器就认为,这个值是只读的,就会在寄存器中保存这
个变量的值,每次需要的时候从寄存器直接读取,但是有时候,我们
可能会在不经意间修改了这个变量,比如说我们去了这个变量的地
址,然后强行改变这个变量在内存中的值,那么编译器并不知道,读
取还是从寄存器中读取,这就造成了结果的不匹配,而volatile声明
的变量就会告诉编译器,这个变量随时会改变,需要每次都从内从中
读取,就是不需要优化,从而避免了这个问题,其实,volatile应用
更多的场景是多线程对共享资源的访问的时候,避免编译器的优化,
而造成多线程之间的通信不匹配!
4、explicit关键字
首先需要了解什么是隐式转换,即在你没有进行显示的强转的情况
下,赋值运算符左右两个类型不一致的对象进行了类型转换;或者
函数传参的时候进行了类型转换; 而explicit关键字存在的目的就是
禁止类的构造函数进行隐式的类型转换,常见的就是string类的对象
就可以隐式类型转换,比如:

string  s = "hello world";

因为string 有一个单参的char*构造函数,所有可以用hello w
orld构造一个string对象,然后调用string 类的拷贝构造函数;

有时候我们并不希望这种不是我们预期的情况发生,所以,我们可以在类的构造函数之前+explicit关键字。禁止隐式转换

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值