持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
1、引用变量
在C++中有一种和指针变量量非常相似的变量叫引用变量,他们的定义方式也很相似。引用变量的作用可以看作为某个变量名取一个别名,所以在定义引用变量时要对其进行初始化,所以就要先定义一个变量,再定义一个引用变量。如下:
int a=10;
int &aa = a;
cout <<"aa="<< aa << endl;
此时运行的结果是 aa=10;因为aa是a的别名,输出aa就是输出a。若在第二行下加一个 “a=100”或“aa=100”。则最后输出的结果就是100。因为aa与a是等价的,都是同一个变量的名字。
int a=10;
int &aa = a;
cout << aa << endl;
a = 100;
cout << aa << endl;
2、引用变量做函数参数
void swap1(int a1, int b1)
{
int temp = a1;
a1 = b1;
b1 = temp;
cout << "a1=" << a1 << " b1=" << b1 << endl;
}
int main()
{
int a=10,b=5;
cout << "a=" << a << " b=" << b << endl;
swap1(a, b);
cout << "a=" << a << " b=" << b << endl;
system("pause");
}
可以观察到,使用函数swap1 实现两个数交换时是无法实现的。原因在于,main函数中的变量a,b的值传递给形参a1,b1。a1,b1的值发生了交换,而a和b的值并没有变,在函数结束之前,a1,b1的数据被释放。这种方式叫做值传递,是一种单向传递。 下面来看swap2函数
void swap2(int *aa, int *bb)
{
int t = *aa;
*aa = *bb;
*bb = t;
}
int main()
{
int a=10,b=5;
cout << "a=" << a << " b=" << b << endl;
swap2(&a, &b);
cout << "a=" << a << " b=" << b << endl;
system("pause");
}
swap2采用是指针变量做函数参数,此时传进swap2函数的是a,b的地址&a,&b,再用*号对其进行解引用,又可以实现对这两地址上的数据进行操作,最后也就实现了两个数的交换。这种方式叫地址传递,是一种双向传递。
下面来看swap3函数
void swap3(int &aa, int &bb)
{
int t = aa;
aa = bb;
bb = t;
}
int main()
{
int a=10,b=5;
cout << "a=" << a << " b=" << b << endl;
swap3(a, b);
cout << "a=" << a << " b=" << b << endl;
system("pause");
}
可以明显明显观察到,swap3 的运行结果与swap2相同。这种方式叫引用传递,其效果与地址传递一样。程序进行时,把给a传给引用变量aa,aa就是a的别名,同理,bb就是b的别名。在swap3中aa,bb进行交换,在主函数中就是a,b进行交换。
3、引用变量的本质
引用变量其本质就是常量指针。所以引用变量一旦初始化就不能改变,即aa一旦做了a的别名,就不能再做b的别名了。当我们定义一个引用变量时,编译器会为我们进行这样的操作:
int a=10;
int &aa = a;//相当于 int const *aa=&a;
aa=100;//相当于 *aa=100;
cout <<"aa="<< aa << endl;
最后,在C++中是提倡使用引用变量的,即便捷有安全。