到目前为止,我们已经了解到 C++ 支持两种类型的变量:
普通变量是包含某种类型的值的变量。比如我们创建一个int类型的变量,也就是说这个变量可以保存整数类型的值。
指针是存储另一个变量地址的变量。可以取消引用以检索此指针指向的值。
C++支持的还有一个变量,即引用。它是一个变量,充当另一个变量的别名。
只需使用与号 (&) 运算符即可创建引用。当我们创建一个变量时,它会占用一些内存位置。我们可以创建变量的引用;因此,我们可以使用变量名或引用来访问原始变量。例如,
int a=10;
现在,我们创建上述变量的引用变量。
int &ref=a;
上面的语句意味着'ref'是'a'的引用变量,即我们可以用'ref'变量代替'a'变量。
对非常量值的引用
作为别名的引用
对非常量值的引用
它可以通过使用 & 运算符和引用类型变量来声明。
#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 << "a 的值为:" <<a<< std::endl; std::cout << "b 的值为:" <<b<< std::endl; std::cout << "c 的值为:" <<c<< std::endl; return 0;}
在上面的代码中,我们创建了一个包含值“70”的变量“a”。我们已经声明了两个引用变量,即 b 和 c,并且都引用同一个变量“a”。因此,我们可以说“a”变量可以被“b”和“c”变量访问。
输出
a 的值为:70 b 的值为:70 c 的值为:70
以下是引用的属性:
初始化
它必须在声明时初始化。
#include <iostream> using namespace std; int main() { int a=10; //变量初始化 int &b=a; // b 对 a 的引用 std::cout << "a 的值为 " <<b<< std::endl; return 0; }
在上面的代码中,我们创建了一个引用变量,即'b'。在声明时,'a'变量被分配给'b'。如果我们在声明时不赋值,那么代码将如下所示:
int &b; &b=a;
上面的代码将抛出编译时错误,因为在声明时未分配 'a'。
输出
a 的值为 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 对 z 的引用,但会引发编译时错误。 ^ main.cpp:17:9: 注意: 'int& y' 之前在这里声明 int &y=x; // y 对 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 的值为:10b 的值为: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; }
在上面的代码中,我们试图访问员工个人资料结构的“id”。我们通常使用语句 epid 来访问这个成员,但是如果我们有多个访问这个成员的权限,这将是一个乏味的任务。为了避免这种情况,我们创建一个引用变量,即ref,它是'epid'的别称。
输出
34