常量和引用

温习c++至引用部分,做如下整理。

1. const

用于修饰变量,表明不能修改。常用于修饰函数参数和普通变量。常问的点有指针常量和常量指针。

指针常量:int * const p; 表明指针p是一个常量,指向一个int行变量。

    int a;  
    int b;  
    int * const p = &a;  
    p = &b; //指针p不可修改

常量指针: const int *p; 表明p指向是一个int型的常量。

    int a = 1;
    const int b = 2;

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

    *p = 2; //错,p指向的内容不可修改

记忆的话很好记,常量指针就是 先常量(const)再指针(*),指针常量相反。


2. const用法

标明不可改变

修饰函数参数

当希望函数参数在函数内部不改变,可用const修饰。对基本数据类型Int等无必要,对指针和类可用.如

    void Fun(const char *pStr);

    void Fun(A a);
    void Fun(const A &a); /* 当希望对象a不可改变时,为减少对临时对象的拷贝,复制,析构,可以使用对象A的const引用。*/

修饰变量

常用的用法,修饰不可更改的变量。

修饰函数返回值

希望函数返回值不可改变,如string的c_str用法。

    const char * c_str(std::string str);

修饰函数定义体

任何不会修改数据成员的函数都应该声明为const 类型。如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性

class Stack  
{  
public:  
    void Push(int elem);  
    int Pop(void);  
    int GetCount(void) const; // const 成员函数  
private:  
    int m_num;  
    int m_data[100];  
};  

3. 引用

开始学习的时候都说引用是一个别名,个人感觉太笼统,查阅相关资料(C++中引用的本质)并自行验证后发现引用就是一个指针,有地址空间,内部存放其他变量的地址。
例证如下:从汇编语言来看,两者本质一样。

int i=5;
00A013DE  mov        dword ptr [i],5    //将文字常量5送入变量i
int &ri=i;
00A013E5  lea        eax,[i]            //将变量i的地址送入寄存器eax
00A013E8  mov        dword ptr [ri],eax  //将寄存器的内容(也就是变量i的地址)送入变量ri
ri=8;
00A013EB  mov         eax,dword ptr [ri]  //将变量ri的值送入寄存器eax
00A013EE  mov         dword ptr [eax],8   //将数值8送入以eax的内容为地址的单元中
return 0;
00A013F4  xor         eax,eax    

这里顺便提到一些概念。变量只是编译器给的一个抽象概念,实际上只有地址和地址空间内容。


4. const引用和非const引用

区别在于const引用可以绑定到类似类型和右值上。不过不可修改。例:

    double d = 12.12;
    const int & a = d;
    const int & b = 12;

非const引用不能绑定右值和类似类型,只能绑定同类型。例:

    double d = 12.12;
    int & a = 1; //错,不能绑定右值
    int & b = d;//错,不能绑定非 同类型的变量

    int aa = 1;
    int & c = aa; //对

为何如此呢,具体原因可看c++设计和演化,在c++2.0时做出了该规定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值