const的小结

const对象

把一个对象转换成一个常量,即定义一个常量。因为常量在定义之后就不能被修改,所以定义时必须初始化:

const int a=0;

const对象默认为文件的局部变量,要使得const变量能够在其他文件中被访问,必须显示地指定它为extern。


const 引用

const引用是指:指向const对象的引用。如:

const <span style="font-family: Arial, Helvetica, sans-serif;">int a=0;</span><pre name="code" class="cpp">const int &b=a;//b为a的const引用

 但是,const也可以指向非const对象,当使用非const对象初始化const对象的引用时,系统将非const对象转换为const对象(隐式转换的一种)。 

<span style="font-family: Arial, Helvetica, sans-serif;">int a=0;</span><pre name="code" class="cpp">const int &b=a;//ok,系统自动转换

 

const引用可以初始化为不同类型的对象或者初始化为右值,如字面值常量:

int i = 42;
//legal for const references only
const int &r = 42;
const int &r2 = r + i;
同样的初始化对非const引用却是不合法的,非const引用只能绑定到与该引用同类型的对象。const引用则可以绑定到不同但相关的类型的对象或绑定到右值。


指向const对象的指针

C++要求指向const对象的指针也 必须具有const特性:

const double<span style="font-family: Arial, Helvetica, sans-serif;">*cptr;</span>
如果需要,允许给cptr重新赋值,使其指向另一个const对象。但不能通过cptr修改其所指对象的值。

*cptr=42;//error

允许吧非const对象的地址赋给指向const对象的指针,但不能通过该指针来修改对象的值。

double dval = 3.14;
cptr = &dval; //ok,but can't change dval through cptr
在实际的程序中,指向const的指针常用作函数的形参。将形参定义为指向const的指针,以确保传递给函数的实际对象在函数中不因为形参而被修改。


const指针

与const对象一样,const指针必须在定义时初始化,该指针不能被修改,指向其他对象。

int a = 0;
int *const b = &a;

区分const指针和指向const对象的指针:

如果指针名前紧邻的关键字为const,那么它就是一个const指针;如果声明指针所指向的对象类型前有const关键字,那么它就是一个指向cosnt对象的指针。
应用上面的判断方法,const int *const p; 就表示指向const对象int的const指针。


指针和typedef

typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。
比如:
先定义:
typedef char* PSTR;
然后:
int mystrcmp(const PSTR, const PSTR);
const PSTR实际上相当于const char*吗?不是的,它实际上相当于char* const。 原因在于const给予了整个指针本身以常量性,const修饰的是PSTR整个整体。也就是形成了常量指针char* const。 简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值