C++ References 参考资料

到目前为止,我们已经了解到 C++ 支持两种类型的变量:

  • 普通变量是包含某种类型的值的变量。比如我们创建一个int类型的变量,也就是说这个变量可以保存整数类型的值。

  • 指针是存储另一个变量地址的变量。可以取消引用以检索此指针指向的值。

  • C++支持的还有一个变量,即引用。它是一个变量,充当另一个变量的别名。

如何创建参考?

只需使用与号 (&) 运算符即可创建引用。当我们创建一个变量时,它会占用一些内存位置。我们可以创建变量的引用;因此,我们可以使用变量名或引用来访问原始变量。例如,

句法 (Syntax)

int a=10;

现在,我们创建上述变量的引用变量。

句法 (Syntax)

int &ref=a;

上面的语句意味着'ref'是'a'的引用变量,即我们可以用'ref'变量代替'a'变量。


C++ 提供两种类型的引用:

  • 对非常量值的引用

  • 作为别名的引用

对非常量值的引用

它可以通过使用 & 运算符和引用类型变量来声明。

例子 (Example)

#include <iostream>  
using namespace std;  
int main()  
{  
int a=10;  
int &value=a;  
std::cout << value << std::endl;  
return 0;  
}

输出

10

作为别名的引用

作为别名的引用是被引用的变量的另一个名称。

例如

例子 (Example)

int a=10;   // 'a' 是一个变量。 
int &b=a; // 'b' 引用 a。  
int &c=a; // 'c' 对 a 的引用。

让我们看一个简单的例子。

例子 (Example)

#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

引用的属性

以下是引用的属性:

初始化

它必须在声明时初始化。

例子 (Example)

#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'。如果我们在声明时不赋值,那么代码将如下所示:

例子 (Example)

int &b;  
&b=a;

上面的代码将抛出编译时错误,因为在声明时未分配 'a'。

输出

a 的值为 10

重新分配

不能重新赋值意味着不能修改引用变量。

例子 (Example)

#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'。但是这种重新分配对于引用变量是不可能的,所以它会抛出一个编译时错误。

编译时错误

例子 (Example)

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 的引用 
^

函数参数

引用也可以作为函数参数传递。它不会创建参数的副本,而是充当参数的别名。它提高了性能,因为它不会创建参数的副本。

让我们通过一个简单的例子来理解。

例子 (Example)

#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

引用作为快捷方式

在引用的帮助下,我们可以轻松访问嵌套数据。

例子 (Example)

#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



  • 使用社交账号登录,本站支持
全部评论(0)