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

标签: C++语言, C++语言教程, C++语言技术, C++语言学习, C++语言学习教程, C++语言下载, C++语言开发, C++语言入门教程, C++语言进阶教程, C++语言高级教程, C++语言面试题, C++语言笔试题, C++语言编程思想