const

(1)

const 引用可以初始化为不同类型的对象或者初始化为右值。

int  i =42;

const  int &r = 42;         //去掉const 非法

const int &r2 = r+i;

原因 :

观察将引用绑定到不同的类型时,就可以理解上面的问题

double dval = 3.14;

const int &ri = dval;

编译器会把代码转换成

int temp = dval;

const int &ri = temp;

如果ri不是const,那么就可以将ri赋一新值。这样做不会修改dval,而是修改temp.

期望对ri的赋值会修改dval的程序员会发现dval并没有修改。仅允许const引用绑定

到需要临时使用的值完全避免了这个问题,因为const引用是只读的,不能在被修改。


非const引用只能绑定到与该引用同类型的对象。

const引用则可以绑定到不同但相关的类型的对象或者绑定右值。


(2)
const int *p  与 int const *p 等价  

p是一个指向int 类型的const对象的指针,const 限定了p指针指向的对象类型,而非p本身。

也就是说,p本身不是const,在定义时不需要对它进行初始化,如果需要的话,允许给p重新

赋值,使其指向另一个const 对象( p = &b;),但不能通过 *p = 42 来修改其所指向对象的值。


int  *const p  指向int型对象的const 指针,  指针p就是const对象 在定义的时候必须初始化,

也不能修改p 的指向,但是可以通过*p来修改其所指向的对象。


(3)

typedef  string *pstring;

const pstring cstr;


很容易被理解为 const string *cstr;   是错误的。

声明const pstring 时,const修饰的是pstring的类型,这是一个指针。

因此,该声明语句应该是把cstr定义为指向string类型对象的const指针。

应该等价于         string *const cstr;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值