C++笔记(3)引用

引用是变量的别名。也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

1.创建引用

int i = 0;
int& r = i;//r是一个出初始化为i的整型引用,r和i的内存地址是相同的。

2. 引用和指针的区别

引用和指针很像,它们都不会创建副本,因此效率都很高。它们之间有三个主要的不同:

  • 不存在空引用。引用必须连接到一块合法的内存。指针可能传递一个 NULL 过来,因此在使用前必须检查有效性;引用则必然代表某个对象,不需要做此检查。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。
  • 选择成员的时候,引用使用点 . 来查找,而指针则使用 -> 来查找。

3.引用作为参数传递给函数

Time Time::Sum(const Time& t) const {
    Time sum;
    sum.minutes = minutes + t.minutes;
    sum.hours = hours + t.hours + sum.minutes / 60;
    sum.minutes %= 60;
    return sum;
}    

在一般函数中,会将实参的值复制给形参,在被函数使用。如果实参占用大量内存,会使得内存开销很大。传递引用,代码的功能相同,但是使用的内存更少,速度将更快。

4.引用作为函数返回值

警告:不要返回指向局部变量或临时对象的引用!函数执行完毕后,局部变量和临时对象将消失,引用将指向不存在的数据。

示例1:

Time Time::Sum(const Time& t) const {
    Time sum;
    sum.minutes = minutes + t.minutes;
    sum.hours = hours + t.hours + sum.minutes / 60;
    sum.minutes %= 60;
    return sum;
}   

上述代码创建了一个新的Time对象(sum),表示另外两个对象的和。返回对象将创建对象的副本。

如果返回对象为Time&,则引用的将是sum对象。由于sum对象是局部变量,在函数结束时被删除,因此引用将指向一个不存在的对象。使用但会类型Time意味着将在删除sum之前构造它的拷贝,调用函数将得到该拷贝。

示例2:

#include <iostream>
using namespace std;

int& getValue();

int main ()
{   
    int& a = getValue();
    cout << "a is " << a << endl;
    return 0;
}

int& getValue()
{
    static int ret = 100;
    return ret;
}

(1)以引用返回函数值,定义函数时需要在函数名前加 &
(2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本

 

内容来自:

https://blog.csdn.net/wohu1104/article/details/108188895

《C++ Primer Plus》 p312

posted @ 2021-07-17 18:07  湾仔码农  阅读(76)  评论(0)    收藏  举报