《C++ Primer》读书笔记(3.5,3.6)

const 限定修饰符

常量,在程序中任何改变这个值的企图都将导致编译错误 因此 它被称为是只读的[read- only]。因为常量在定义后就不能被修改,所以它必须被初始化。未初始化的常量定义将导致编译错误 。


minWage 是一个常量对象 因此它不能被改写为一个新的值

        const double minWage = 9.60; 
 

    cptr 是一个指向double 类型的const 对象的指针

const double *cptr;	 

  我们可以从右往左把这个定义读为:  cptr 是一个指向double 类型的 被定义成const 的对象的指针。此中微妙在于cptr 本身不是常量 我们可以重新赋值cpt,使其指向不同的对象 但不能修改cptr 指向的对象。例如  

  	const double *pc = 0; 
        const double minWage = 9.60; 

        // ok: 不能通过 pc修改 minWage 
        pc = &minWage; 

        double dval = 3.14; 

        // ok: 不能通过 pc修改 dval 
        // 虽然 dval本身不是一个常量 
        pc = &dval; // ok

        dval = 3.14159;    // ok 
	*pc = 3.14159;     // 错误   

const 对象的地址 只能赋值给指向const 对象的指针 例如pc                  但是 指向const 对象的指针可以被赋以一个非const 对象的地址 例如 

        pc = &dval;  

    虽然dval 不是常量 但试图通过pc 修改它的值 仍会导致编译错误 因为在运行程序的任意一点上 编译器不能确定指针所指的实际对象 

    在实际的程序中 指向const 的指针常被用作函数的 形式参数 它作为一个约定来 保证被传递给函数的实际对象在函数中不会被修改


引用类型  
    引用 reference   有时候又称为别名[alias]。引用类型由类型标识符和一个取地址操作符来定义 引用必须被初始化
例如 
        int ival = 1024; 


        // ok: refVal是一个指向 ival的引用 
        int &refVal = ival; 


        // 错误   引用必须被初始化为指向一个对象 
        int &refVal2; 

引用也可以被用作一种指针 我们可以定义一个指针引用 例如 
        int ival = 1024; 


        // 错误   refVal是 int类型, 不是 int* 
        int &refVal = &ival; 


        int *pi = &ival; 


        // ok: refPtr是一个指向指针的引用 
        int *&ptrVal2 = pi; 

一旦引用已经定义 它就不能再指向其他的对象
        int min_val = 0; 


        // ival被设置为 min_val 的值 
        // refVal并没有引用到 min_val 上 
        refVal = min_val; 
以上代码等价于
ival=0

 const 引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是不可寻址的值,如文字常量 例如 
        double dval = 3.14159; 


        // 仅对于 const引用才是合法的 
        const int &ir = 1024; 
        const int &ir2 = dval; 
        const double &dr = dval + 1.0; 
    同样的初始化对于非const 引用是不合法的 将导致编译错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值