C++教程-C++中的引用

C++中的引用
到目前为止,我们已经学习了C++支持的两种类型的变量:
- 普通变量是包含某种类型值的变量。例如,我们创建一个整型变量,这意味着该变量可以保存整型值。
- 指针是存储另一个变量的地址的变量。可以通过解引用来检索指针指向的值。
- 在C++中还有另一种变量,即引用(References)。引用是作为另一个变量的别名而行为的变量。
如何创建引用?
通过使用'&'操作符可以创建引用。当我们创建一个变量时,它占用一定的内存位置。我们可以创建变量的引用,因此我们可以通过使用变量名或引用来访问原始变量。例如:
int a = 10;
现在,我们创建上述变量的引用变量。
int &ref = a;
上面的语句表示'ref'是'a'的引用变量,也就是说,我们可以在'a'变量的位置使用'ref'变量。
C++提供了两种类型的引用:
- 对非常量值的引用
- 作为别名的引用
对非常量值的引用
它可以使用引用类型变量的'&'运算符进行声明。
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int &value = a;
std::cout << value << std::endl;
return 0;
}
输出结果:
10
作为别名的引用
作为别名的引用是被引用的变量的另一个名称。
例如:
int a = 10; // 'a'是一个变量。
int &b = a; // 'b'引用'a'。
int &c = a; // 'c'引用'a'。
让我们看一个简单的例子。
#include <iostream>
using namespace std;
int main()
{
int a = 70; // 变量初始化
int &b = a;
int &c = a;
std::cout << "Value of a is: " << a << std::endl;
std::cout << "Value of b is: " << b << std::endl;
std::cout << "Value of c is: " << c << std::endl;
return 0;
}
在上面的代码中,我们创建了一个变量'a',它包含一个值'70'。我们声明了两个引用变量'b'和'c',它们都引用同一个变量'a'。因此,我们可以说'a'变量可以通过'b'和'c'变量来访问。
输出结果:
Value of a is: 70
Value of b is: 70
Value of c is: 70
引用的特性
引用具有以下特性:
初始化
在声明时必须进行初始化。
#include <iostream>
using namespace std;
int main()
{
int a = 10; // 变量初始化
int &b = a; // b引用a
std::cout << "Value of a is: " << b << std::endl;
return 0;
}
在上面的代码中,我们创建了一个引用变量'b'。在声明时,将'a'变量赋给了'b'。如果在声明时没有进行赋值,代码将如下所示:
int &b;
&b = a;
上面的代码将引发编译时错误,因为在声明时未进行赋值。
输出结果:
Value of a is: 10
重新赋值
不能重新赋值,即引用变量不能被修改。
#include <iostream>
using namespace std;
int main()
{
int x = 11; // 变量初始化
int z = 67;
int &y = x; // y引用x
int &y = z; // y引用z,但是会引发编译时错误。
return 0
在上面的代码中,'y'引用变量引用了'x'变量,然后将'z'赋值给'y'。但是,引用变量不允许重新赋值,因此会导致编译时错误。
编译时错误:
main.cpp: 在函数'int main()'中:
main.cpp:18:9: 错误:重新声明'int& y'
int &y=z; // y reference to z, but throws a compile-time error. ^
main.cpp:17:9: 注意:已在此处先前声明'int& y' int &y=x; // y reference to x
^
函数参数
引用也可以作为函数参数进行传递。它不会创建参数的副本,而是作为参数的别名。这提高了性能,因为不会创建参数的副本。
让我们通过一个简单的例子来理解。
#include <iostream>
using namespace std;
int main()
{
int a=9; // 变量初始化
int b=10; // 变量初始化
swap(a, b); // 调用函数
std::cout << "a的值为:" <<a<< std::endl;
std::cout << "b的值为:" <<b<< std::endl;
return 0;
}
void swap(int &p, int &q) // 函数定义
{
int temp; // 变量声明
temp=p;
p=q;
q=temp;
}
在上面的代码中,我们交换了'a'和'b'的值。我们将变量'a'和'b'传递给swap()函数。在swap()函数中,'p'引用了'a','q'引用了'b'。当我们交换'p'和'q'的值时,也就是交换了'a'和'b'的值。
输出结果
a的值为:10
b的值为:9
引用作为快捷方式
借助引用,我们可以轻松访问嵌套数据。
#include <iostream>
using namespace std;
struct profile
{
int id;
};
struct employee
{
profile p;
};
int main()
{
employee e;
int &ref=e.p.id;
ref=34;
std::cout << e.p.id << std::endl;
}
在上面的代码中,我们尝试访问employee结构的profile结构的'id'。通常情况下,我们通过使用语句e.p.id来访问该成员,但是如果我们需要多次访问该成员,这将是一项繁琐的任务。为了避免这种情况,我们创建了一个引用变量'ref',它是'e.p.id'的另一个名称。
输出结果
34