C++引用

251 阅读2分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

引用可以理解为给变量起一个别名,主要用于传参,通过定义引用变量,可以不使用副本,直接使用原始数据。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。

引用的定义

int val = 1024;
int &reval = val; //reval指向val(是val的另一个名字)
int &reval2; //报错,引用必须被初始化
int &reval3 = 1024; //报错,引用类型的初始值必须是一个对象
double dval = 3.14;
int &reval4 = dval; //报错,引用类型的初始值必须与其修饰符类型一致
  • 引用并非对象,只是一个已经存在的对象所起的另一个名字。因此定义一个引用,并不会开辟对象的内存空间,只会开辟存储引用变量的内存空间。
  • 因为引用并非对象,所以定义时必须进行初始化,也不能定义引用的引用。
  • 定义一个引用之后,对其进行的操作都是在与之绑定的对象上进行的。

来看一个例子

#include<iostream>
using namespace std;  
int main(){    
    int a = 1;    
    int c = 2;    
    int &b = a;    
    cout << "a=" << a << " 地址:" << &a <<endl 
        << "b=" << b << "  地址:" << &b <<endl <<endl;    
    a++;    
    cout << "a=" << a <<  "  地址:" << &a <<endl 
        << "b=" << b << "  地址:" << &b <<endl <<endl;    
    b++;    
    cout << "a=" << a <<  "  地址:" << &a <<endl 
        << "b=" << b << "  地址:" << &b <<endl <<endl;    
    b=c;//这里是赋值,将c的值赋给b,而不是将b改为c的引用    
    cout << "a=" << a <<  "  地址:" << &a <<endl 
        << "b="<< b << "  地址:" << &b <<endl<<endl;    
    system("pause");
}
运行结果如下:
a=1  地址:0015FAB8
b=1  地址:0015FAB8

a=2  地址:0015FAB8
b=2  地址:0015FAB8

a=3  地址:0015FAB8
b=3  地址:0015FAB8

a=2  地址:0015FAB8
b=2  地址:0015FAB8

可见,a和b的值和地址是完全相同的,修改a或b任意一个变量,另一个会随之改变。

引用传参

引用常被用于传参,通过定义引用变量,可以不使用副本,直接使用原始数据,这样可以代替传递指针。

通过引用来传参,可以直接对原始数据进行修改,从而达到和传递指针一样的效果,而且操作起来更加直观方便。

#include <stdio.h>

void add(int &p_a){
    p_a = p_a+1;
}

int main(){
    int a = 2;
    printf("a=%d\n", a);
    add(a);
    printf("a=%d\n", a);

    return 0;
}
  • 注意此时add()函数的传入参数必须是int型变量,如果传入int数或公式会报错,例如:

    • add(3); //错误
    • add(b+3); //错误
  • 如果将引用定义为const,就可以使用常数和公式了。