C++引用的总结

来源:互联网 发布:淘宝客挣钱 编辑:程序博客网 时间:2024/06/10 10:00

1、引用介绍

   简而言之,引用就是一个对象的别名,它通常用于函数的参数表中及函数返回值中,当然也可以独立使用。例如一个叫小明的同学

,在班上同学们给他起了个外号,不管叫小明还是他的外号都是叫小明他自己就和引用一样,如下:

   int a;

   int &b = a;

此时b就是a的引用,我们可以通过b来修改a,此处应注意:引用在创建时就应该初始化为指向一个已存在的对象,并且引用一旦被初始化就不可以修改其指向

2、const引用

   const引用很明显就是指向const对象的引用,如:

    const int a = 14;

    const int &b = a;

    此时的iRefTest就是一个const引用,我们可以通过它来读取iTest的值但是却不能修改iTest的值,同时应注意:非const引用不能指向const对象,因为这样可能会修改const对象的值,所以这是不被允许的

所以:非const引用只能指向非const同类型的对象,但是const引用可以初始化为不同但相关的类型的对象或者初始化为右值。

3、函数中的引用

  在函数中引用的使用是很广泛地,最经常见到的就是函数的参数和函数的返回值,当引用被用作函数的参数时,任何对引用的更改都会改变函数外的参数;当引用被用作函数的返回值时,我们必须像对待指针一样对待返回的引用,当函数返回时,不管返回的引用关联的是什么都应该是存在的,否则我们将不知道引用指向哪个内存区域。

如下面这样:

int& Fun()

{

    int a = 5;

    return a;//这样就是不行的,因为当函数结束时,a作为局部变量被释放了,已经不存在

    static b = 5;

    return b;//这样就是可以的,因为b存在于全局静态区,所以直到程序结束就不会释放

}

4.使用引用作为函数参数及返回值的用法及注意点。

(1)引用作为函数的参数时

非引用形参:

非引用形参我们有分为一般的值传递及指针传递,一般的值传递从字面意思就可以看出来就是单纯的值的传递,即通过复制的传递的实参的副本来进行的,而实际上的实参没有进行任何的操作,当函数结束时,形参也就不再存在。第二类是指针形参,指针形参顾名思义就是传递的是地址,实际上同样是值传递,只不过从传递的是地址值,此时当我们对传递的参数的值进行操作时,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而形成了实参的一个副本,所以当我们修改局部变量时,同时修改了实参指向的值,但是如果我们在函数中修改形参的地址指向却不会修改实参的指向,临时变量虽然是实参的副本,但只是表示指向相同,本质上表示两个不同的指针。

下例说明指针传递的过程:

void FunPtr(int *pIVal)

       {

           *pIVal = 5;//修改了pIval所指向的对象的值

           pIVal = 0;//pIVal置为0,但是传递的参数的值并没变,这里改变的只是临时变量的值

        }

引用形参:

引用形参在C++中用途广泛,c++也推荐使用引用作为形参,而非用指针,指针本质上依然是值传递,但是引用不是引用形参实际上是传递实参的别名,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间但是这是存放的是由主调函数放进来的实参的地址被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量,正式以为如此,被调函数对形参做的任何操作都影响着主调函数的





原创粉丝点击