C++ 之重学 const

1、默认状态下,const对象仅在当前文件内有效

默认情况下,const对象被设定为仅在当前文件内有效。当多个文件中出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量

解决的办法是,对于const变量不管是声明还是定义都添加extern关键字,这样只需在一个文件定义一次就可以了。

2、对const的引用

把引用绑定到const对象上,称之为对常量的引用
在这里插入图片描述
虽然引用不是对象,但是引用有地址,可以用&获取引用的地址,引用的地址就是绑定到的对象的地址。

普通引用无法绑定到字面值常量,但是const的引用可以绑定到一个字面值常量,而且绑定对象的类型可以和引用的类型不同

double d = 3.14;
const int& r = d;

这太神奇了!!!那么,这是为什么呢?
其实,r绑定的是一个临时对象,编译器把上述的第二条语句改成了如下形式:

const int temp = d;double生成一个临时的const int
const int& r = temp;	r 绑定到这个临时量

3、指针和const

只有 *放在const关键字前面用来说明指针是一个常量

当你把*放在const后面时, const修饰的就不是*(指针)了,所以也就不是指针常量了。

那,把*放在const后面时,const到底修饰谁?他总要起作用吧。
我自己总结了下面这样的规律:

  • ① 当const出现在第一个位置时,他修饰的就是它后面出现的第一个标识符。
  • ② 当const不在第一个位置时,他修饰的是它前面出现的第一个标识符。

以下面的声明为例:

char const * p1;			
const char const * p2;		这两条声明其实是等价的

p1p2的类型其实是一样的
p1的声明中,const修饰它前面的标识符,也就是char,所以p1const char*类型,是个指向常量的指针
p2的声明中,第一个const修饰它后面的char,而第二个const也修饰char。所以第二个const其实是多余的,不写也没关系,但即使他是多余的,她也不会去修饰后面的*。所以p2也是const char*类型,也是指向常量的指针。

再举一个例子:

char* const p3;				错误,没提供初始值
const char* const p4;		错误,没提供初始值

这两条语句其实都不能通过编译。因为p3p4都是const指针,必须为其提供初始值才行,不过这不影响我们分析它们的类型。
p3的声明中,const修饰它前面的*,所以p3是个指针常量,指向char类型。
p4的声明中,第一个const修饰char,第二个const修饰*,所以p4也是个指针常量,指向const char类型。
因为两个指针都是常量,所以初始化的时候必须给出他们的明确指向。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值