const常量的用法与易错点分析

本文通过对c++ primer的总结以及个人理解,总结成一篇博客帮助自己复习。

1.常量的使用:

我们定义一种变量,它的值不能被改变,可以使用关键字const对变量的类型进行限定。
我们举个栗子:

//i正确,j错误,k正确, c正确。
//i,c正确初始化,j没有初始化,k是一个未经初始化的常量,一旦运行函数将被初始化。
const int i = 1;
const int j;
const int k = get_size();
const int c = i;

在多个文件共享const对象时,可以使用关键字extern关键字。
举个栗子:

//file.cc 文件初始化一个常量,可以被其他文件访问。
extern const int i = 1;
//file.h 头文件。
extern const int i;

2.const与引用

我们对常量的引用,引用以及对应的对象都是常量。
举个栗子:

const int i = 1; // 正确
const int &r = i;  // 正确
const int &j = 1; // 正确
r = 2; // 错误,r是常量引用,不能改变值
int &p = i; // 错误,非常量引用不能指向常量引用

特别地,当常量引用被绑定到另外一种类型时,会产生一个临时值。
我们举个栗子:

double i = 0.1;
const int &r = i;
// 此时相当于:
const int i_1 = i; // 此时的i_1等于0
const int &r = i_1;

3.const与指针

常量指针也必须要初始化,接下来是大家比较容易乱的地方。这里会用大量的栗子进行描述。

我们先介绍指向常量的指针:

const int i = 1;
const int *j = &i; // 正确,j指向i
int k = 2; 
*j = &k; // 错误,j被初始化后已经指向了i,我们不能给*j赋值了
j = &k; // 正确,我们只是不能给*j赋值,但可以将k的地址赋给j指针本身。现在属于常量的是j指向i所代表的值,而j本身不是常量。

接着介绍const指针:

int r = 0;
int *const i = &r; //i将会一直指向r,此时i的本身是常量,而*i的值是r,r可以改变,与i无关。
const int j  = 1;
const int *const k = &j; // k是一个指向常量的常量指针,k本身不能改变,同时指向的值j也不能改变。

做个比较:

const int b = 1;
int c = 2;
int *const a_1 = &b; // 错误,要a_5的使用方法才正确 
int *const a_2 = &c; // 正确,a_2会一直指向b,指针本身自己的值是常量,与a_2指向的值是不是常量无关
const int* a_3 = &b; // 正确,a_3指向的b必须为常量
const int* a_4 = &c; // 错误,c不是常量
const int *const a_5 = &b; // 正确,a_5本身是常量指针,同时指向的值b也是常量
const int *const a_6 = &c; // 错误,a_6指向的值c不是常量

const类型对象,引用都必须初始化,而指针则不用:

const int i; // 错误
const int &j; // 错误
const int *k; // 正确

注意:

int &i = 0; // 错误,引用的初始化必须指向一个对象
const int &j = 0; // 正确,常量引用可以这么初始化

接下来是顶层const与底层const:
可以记为指针本身为常量则为顶层,指针指向的值为常量则为底层, 用于声明引用的为底层。

int a = 0;
const int b = 1;
int *c = &a;
int *const c_1 = &i; // 顶层
const int d = 2; // 顶层
const int *c_2 = &k; // 底层
const int *const c_3 = c_2; // 顶层,底层
const int &r = d; // 底层
a = d; // 正确
c_2 = c; // 正确
c_2 = c_3; // 正确
c = c_2; // 错误
c = c_3; // 错误

常用的const使用以及注意事项基本都在上文呈现,如果有哪里错误的欢迎大家及时指正!!!参考书籍《c++ primer 5th》。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值