const限定符

有时在程序中希望定义一种变量,它的值不能被改变。为了满足这一要求,可以使用关键字const对变量的类型加以限定,使之成为常量。
const常量创建后其值就不能再更改,因此const对象必须进行初始化。初始值可以是任意字面值、函数返回值、表达式、常量、变量···

const int buf = 512;
buf = 1024;//error,const限定的常量不能改变值

const的引用

const int c = 1024;
const int &r1 = c;//引用及其对象都是常量
r1 = 2048;//error:r1是对常量的引用,值不可更改
int &r2 = c;//error:非常量引用不能指向常量对象

允许为一个常量引用绑定非常量对象、字面值甚至一个表达式

int i = 1024;
const int &r1 = i;//correct
const int &r2 = 2048;//correct
const int &r3 = r1*2;//correct
int &r4 = r1 * 2;//error:r4是普通非常量引用

//当一个常量引用绑定到另一种类型时
double val = 3.14;
const int &r = val;//r是int型引用,但val是double,why?
//编译器进行如下形式
const int temp = val;//生成一个临时的整型常量
const int &r = temp;//让r绑定这个临时量(一个临时对象)

对const的引用可能引用一个非const对象

int v = 1024;
int &r = v;
const int &r1 = v;
r = 0;//correct
r1 = 0;//error

指针和const
和引用一样,也可以令指针指向常量或非常量。指向常量的指针不能用于改变其所指对象的值。要想存放常量对象的地址,只能使用指向常量的指针。

const double pi = 3.14;
double *ptr = π//error
const double *cptr = π//correct
*cptr = 0;//error:不能给常量对象赋值

允许令一个指向常量的指针指向一个非常量对象:所谓指向常量的指针仅仅要求不能通过该指针改变对象的值,不代表那个对象的值不能通过其他途径改变。

double dval = 3.14;
cptr = &dval;//correct

const指针
指针是对象,因此允许把指针本身定义为常量。常量指针必须初始化,初始化后指向不可改变(也就是存放的地址不可改变)。

int num = 0;
int *const pn = # // pn将一直指向num
const double pi = 3.14;
const double *const pip = π//pip 是指向常量对象的常量指针

指针本身是一个常量,但指向的对象是非常量,可以通过指针修改对象的值。

顶层底层const
指针本身是不是常量和指针所指是不是常量是两个相互独立的问题。用顶层const来表示指针本身是个常量,而用底层const来表示指针所指对象是个常量。

int i = 1024;
int *const p1 = &i;//不能改变p1的值,这是一个顶层const
const int ci = 2048;//不能改变ci的值,是顶层const
const int *p2 = &ci;//可以改变p2的值,这是底层const
const int *const p3 = p2;//左侧是底层const,右侧是顶层const
const int &r = ci;//用于声明引用的const都是底层const
p2 = p3;//correct

常量表达式
常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。字面值属于表达式,用常量表达式初始化的const对象也是常量表达式。

//一个对象是不是常量表达式由它的数据类型和初始值共同决定
const int max = 1024;//max是常量表达式
const int buf = max + 1;//buf是常量表达式
const int sz = size();//sz不是常量表达式,需要运行才能得到初始化

允许将变量声明为constexor类型以便编译器来验证变量的值是否是一个常量表达式。
声明为constexpr的变量一定是一个常量,并且必须使用常量表达式初始化。

constexpr int max = 1024;//1024是常量表达式
constexpr int buf = max + 1;//max+1是常量表达式
constexpr int sz = size();//只有当size()是一个constexpr函数时才是一条正确的语句

constexpr声明中如果定义了一个指针,限定符constexpr只对指针有效,与指针所指的对象无关

const int *p = nullptr;//p是一个指向整型常量的指针,底层const
constexpr int *q = nullptr;//q是一个常量指针,顶层const
constexpr int i = 1024;
constexpr const int *p = &i;//p是常量指针,指向整型常量i
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值