const(常量)限定符

一、 const(常量)

在想要使用某个变量定义一个数据,且不想让该变量在程序中随意变化,但是又能够自己修改变量,可以定义变量为const;

const int i = 20;//(必须初始化)初始化可以是任意的复杂形式,比如函数
i = 30; //错误
int j = 10;
const a = j; // 正确,拷贝操作;
int b = a; //正确,拷贝操作不会改变变量的值;

变量的类型决定了变量的操作,如const限定了变量无法随意修改值,因此对i进行赋值操作是错误的;无法赋值所以需要对const变量进行初始化。

== 小知识 ==

const常量只能在本文件中有效;
如上例中,i = 20;在编译器进行编译时,将所有遇到的i都替换成20,因此const变量必须初始化。
如果在不同的cpp中定义同一个const变量,只能说明定义了不同的变量,本文件就引用本文件定义的那个。

而如果某个const变量是由某个函数初始化,而其他文件.cpp也要用到该变量,这种情况下也是可以的:
1、需要在定义时用关键字extern ;
2、在别的文件中声明时需要加上关键字 extern;

## .cpp文件 定义
extern const int i = fcn();//必须extern声明;
## .h文件 声明
extern const int i;//此时为声明变量i,需要关键字exrern,说明该变量是共享的。

二、对const的引用(简称 常量引用)

const int  i = 10;
const int &r1 = i; //引用
r1 = 20;//错误,不能对r修改,如果修改,则修改了i,但是i是一个常量;

int &r2 = i;//错误,需要const int类型的引用;

1、引用时,引用的变量必须与所引用对象为同一种类型;但是有一种情况可以不满足:

初始化const的引用时,可以使用任意表达式作为初始值;

int i = 10;
const int &r1 = i;
const int &r2 = 2*i;
const int &r3 = 2*r1;
const int &r4 = 123;
//以上四种都正确

2、对常量的引用,引用的对象不一定是常量对象;

int i = 10;
int &r1 = i;
const &r2 = i;
r1 = 20;//可以通过r1来修改i的值;
r2 = 20//错误,r2是一个常量引用

三、指针和const

指向常量的指针,叫做常量指针;

const int i = 10;
const int *p1 = &i; //常量指针;
*p1 = 20//错误,不能通过指针修改变量的值;

常量指针指向的不一定是常量,但是不能通过指针来修改变量的值,但是这个值可以通过别的方式修改。

int i = 10;
const int *p = &i; //常量指针指向的i,i不是一个常量;
*p = 5; //错误,不能通过指针p来修改i的值;
i = 5; //正确,i通过重新赋值的方式来修改值;

思路:
常量指针和常量引用 只是 觉得自己指向了常量,自觉的不去修改常量的值而已。

const 指针

常量指针:指针作为一个对象,(引用不属于对象),必须初始化。而初始化后的常量指针不能再修改值(即指针内部存的地址)。但是常量指针指向的对象 不能通过常量指针来改变,但是能否通过其他方式改变取决于该变量是否是常量。

int i = 10;
int *const p1 = &i; //*const 表示p1是一个常量指针。指针内的地址不能改变。
*p1 = 5;//错误,不能通过常量指针p1来修改i的值;
int t = 5;
i = t; //正确;因为变量i是一个普通类型的int;

const int j = 10const int *const p2 = &j; //指向常量变量的常量指针
*p2 = 5;//错误
j = i;//错误,因为变量j是一个const;

注意:指向常量的指针 不是必须初始化;常量指针必须初始化;

const int *p; //不是必须初始化;
int *const p = &i; //指向int变量的常量指针必须初始化

四、顶层const

1、定义

顶层const与底层const的区别:
起因:因为指针本身是一个对象,指针也可以指向一个对象,因此两个对象都可以 const限制。
对指针本身进行const:顶层const;
对所指对象进行const:底层const;

int r = 10;
int *const p1 = &r;//顶层const;此时p1无法修改
const int *p2 = &r;	//底层const;此时p2可以变。将int类型的r 修改为const int类型;

const int *const p3 = &r; //正确,p3为顶层加底层const;

const int &c = r; // 底层const,用于声明引用的const都为底层const;

2、赋值用法

对顶层const,进行赋值时没有影响;
对底层const,所赋值的两个对象的类型需要相同。
在这里插入图片描述

五、constexpr 和 常量表达式

1、常量表达式

常量表达式是 值不会改变并且在编译过程中就能得到结果的表达式。

一个表达式是否为 常量表达式,由 变量的类型与初始值共同决定;
在这里插入图片描述

2、constexpr

一般来说,变量的定义与使用是两回事,很难分辨出来是否是常量表达式,因此给出:constexpr类型
如果一个变量由constexpr定义,则认为是一个常量表达式。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值