C++ 引用

26次阅读
5 条评论

共计 1701 个字符,预计需要花费 5 分钟才能阅读完成。

C++  引用

引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。

一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

引用必须在定义时初始化,并且一旦绑定到一个变量后,就不能再绑定到其他变量。

引用的语法如下:

int a = 10;
int &ref = a;  // ref 是 a 的引用
  • int &ref 表示 ref 是一个 int 类型的引用。
  • ref 是 a 的别名,对 ref 的操作会直接作用于 a

C++ 引用 vs 指针

引用很容易与指针混淆,它们之间有三个主要的不同:

  • 不存在空引用,引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。
  • 引用的对象必须是一个变量,而指针必须是一个地址。
特性 引用 指针
定义与初始化 必须初始化,且不能为  null 可以不初始化,可以在后续代码中指向其他对象,可以为  null
语法 使用  &  声明,例如:int &ref = a; 使用  *  声明,例如:int *ptr = &a;
重新绑定 不能重新绑定,一旦初始化后始终引用同一个对象。 可以重新指向其他对象,例如:ptr = &b;
空值(Nullability) 不能为  null,必须绑定到有效的对象。 可以为  null,表示不指向任何对象。
内存占用 不占用额外内存(编译器通常将其优化为直接操作所引用的对象)。 占用额外内存(存储地址,通常是一个机器字长,如 4 字节或 8 字节)。
访问方式 直接使用,无需解引用操作符,例如:ref = 10; 需要使用  *  解引用操作符访问或修改所指向的对象,例如:*ptr = 10;
多级间接访问 不支持多级间接访问(不能有引用的引用)。 支持多级间接访问(如指针的指针:int **pptr;)。
函数参数传递 常用于函数参数传递,语法简洁,例如:void func(int &x) {x = 10;} 也可以用于函数参数传递,但需要使用解引用操作符,例如:void func(int *x) {*x = 10;}
数组与引用 不能直接创建引用数组,但可以创建数组的引用,例如:int (&ref)[10] = arr; 可以创建指针数组,也可以创建指向数组的指针,例如:int *ptrArr[10];
安全性 更安全,不能为  null,且语法更直观。 更灵活,但容易出错(如空指针、野指针等)。
底层实现 通常通过指针实现,但编译器会优化为直接操作所引用的对象。 直接存储目标对象的内存地址。

C++ 中创建引用

试想变量名称是变量附属在内存位置中的标签,您可以把引用当成是变量附属在内存位置中的第二个标签。因此,您可以通过原始变量名称或引用来访问变量的内容。例如:

int i = 17;

我们可以为 i 声明引用变量,如下所示:

int&  r = i;
double& s = d;

在这些声明中,&  读作 引用

因此,第一个声明可以读作  “r 是一个初始化为 i 的整型引用 ”,第二个声明可以读作  “s 是一个初始化为 d 的 double 型引用 ”

下面的实例使用了 int 和 double 引用:

实例

#include <iostream> using namespace std; int main () { // 声明简单的变量 int i; double d; // 声明引用变量 int& r = i; double& s = d; i = 5; cout << “Value of i : ” << i << endl; cout << “Value of i reference : ” << r << endl; d = 11.7; cout << “Value of d : ” << d << endl; cout << “Value of d reference : ” << s << endl; return 0;}

当上面的代码被编译和执行时,它会产生下列结果:

Value of i : 5
Value of i reference : 5
Value of d : 11.7
Value of d reference : 11.7

引用通常用于函数参数列表和函数返回值。下面列出了 C++ 程序员必须清楚的两个与 C++ 引用相关的重要概念:

概念 描述
把引用作为参数 C++ 支持把引用作为参数传给函数,这比传一般的参数更安全。
把引用作为返回值 可以从 C++ 函数中返回引用,就像返回其他数据类型一样。

正文完
 0
评论(5 条评论)
验证码
nustargame 评论达人 LV.1
2025-10-26 16:49:12 回复

Smart bankroll management is key, especially with so many options now! Seeing platforms like nustar game legit offering diverse games (slots, live casino, etc.) is great, but remember responsible gaming first! Verification adds security too.

 Linux  Chrome  中国香港香港宽频
lovart 评论达人 LV.1
2025-11-06 01:59:56 回复

Great insights! It’s refreshing to see AI like Lovart streamline design without losing the human touch-especially the real-time AI suggestions during refinement. A smart move for creative workflows.

 Linux  Chrome  中国广东省广州市联通
ainanobanana 评论达人 LV.1
2025-11-09 09:05:49 回复

That’s a fascinating take on pattern recognition – applies to so much! Thinking about image editing, tools like AI Nano Banana are changing the game with natural language processing – truly accessible on any device! It’s a new level of creative control.

 Windows  Firefox  中国广东省广州市联通
phil168 评论达人 LV.1
2025-11-13 02:14:09 回复

Blackjack strategy can feel overwhelming at first, but breaking it down helps! Seeing platforms like phil168 club offer localized options for Filipino players is smart – makes learning easier when it’s in your language & currency! It’s all about building confidence at the table.

 Macintosh  Chrome  中国香港香港宽频
wowph 评论达人 LV.1
2025-11-16 11:43:14 回复

Really enjoying this article! Thinking about trying my luck online – heard good things about quick payouts & easy access. Checking out wowph apk – seems legit for Filipino players! Hoping for a winning streak! 😉

 Linux  Chrome  中国香港香港宽频