跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 引用基础
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++引用基础 = == 介绍 == '''引用(Reference)'''是C++中一种特殊的变量类型,它为一个已存在的变量提供了一个别名。引用本身不是对象,而是已存在对象的另一个名称。与指针不同,引用必须在声明时初始化,并且不能重新绑定到其他对象。引用在C++中广泛用于函数参数传递、返回值优化以及创建更简洁的代码。 引用有两种主要类型: * '''左值引用(Lvalue Reference)''':绑定到具名对象 * '''右值引用(Rvalue Reference)'''(C++11引入):绑定到临时对象 == 基本语法 == 引用使用<code>&</code>符号声明(右值引用使用<code>&&</code>): <syntaxhighlight lang="cpp"> int x = 10; int &ref = x; // ref是x的引用 </syntaxhighlight> == 引用特性 == === 必须初始化 === 引用必须在声明时初始化,不能先声明后赋值: <syntaxhighlight lang="cpp"> int y = 20; int &ref2; // 错误:引用必须初始化 int &ref2 = y; // 正确 </syntaxhighlight> === 不可重新绑定 === 引用一旦初始化,就不能改变其绑定的对象: <syntaxhighlight lang="cpp"> int a = 5, b = 10; int &ref = a; ref = b; // 这不是重新绑定,而是将b的值赋给a </syntaxhighlight> === 无空引用 === C++不允许空引用,引用必须绑定到有效对象: <syntaxhighlight lang="cpp"> int *ptr = nullptr; int &ref = *ptr; // 未定义行为!虽然编译可能通过 </syntaxhighlight> == 引用 vs 指针 == {| class="wikitable" |- ! 特性 !! 引用 !! 指针 |- | 初始化 || 必须初始化 || 可以不初始化 |- | 可重新绑定 || 否 || 是 |- | 空值 || 不允许 || 允许 |- | 间接访问 || 自动解引用 || 需要*操作符 |- | 内存占用 || 通常不占用额外内存 || 占用指针大小的内存 |} == 引用作为函数参数 == 引用常用于函数参数传递,避免对象拷贝: <syntaxhighlight lang="cpp"> void swap(int &a, int &b) { int temp = a; a = b; b = temp; } int main() { int x = 1, y = 2; swap(x, y); cout << x << " " << y; // 输出: 2 1 return 0; } </syntaxhighlight> == 引用作为返回值 == 函数可以返回引用,但必须确保返回的引用不会悬空(dangling): <syntaxhighlight lang="cpp"> int &getElement(int arr[], int index) { return arr[index]; } int main() { int array[] = {1, 2, 3}; getElement(array, 1) = 10; // 修改array[1] cout << array[1]; // 输出: 10 return 0; } </syntaxhighlight> == 常量引用 == 常量引用可以绑定到临时对象或右值: <syntaxhighlight lang="cpp"> void print(const string &str) { cout << str; } int main() { print("Hello"); // 合法,字符串字面量转换为临时string对象 return 0; } </syntaxhighlight> == 右值引用(C++11) == 右值引用用于实现移动语义和完美转发: <syntaxhighlight lang="cpp"> void process(int &&rval) { cout << "Processing rvalue: " << rval; } int main() { process(42); // 合法,42是右值 int x = 10; process(x); // 错误,x是左值 process(std::move(x)); // 合法,使用move转换为右值 return 0; } </syntaxhighlight> == 实际应用案例 == === 案例1:避免拷贝大对象 === <syntaxhighlight lang="cpp"> struct LargeData { int data[1000]; }; void processData(const LargeData &data) { // 处理数据,避免拷贝整个结构体 } </syntaxhighlight> === 案例2:链式操作 === <syntaxhighlight lang="cpp"> class Counter { int count; public: Counter(int c) : count(c) {} Counter &increment() { ++count; return *this; } int get() const { return count; } }; int main() { Counter c(0); c.increment().increment().increment(); cout << c.get(); // 输出: 3 return 0; } </syntaxhighlight> == 常见误区 == 1. '''认为引用是对象''':引用只是别名,不占用独立存储空间 2. '''试图获取引用的地址''':获取引用地址实际上获取的是被引用对象的地址 3. '''返回局部变量的引用''':会导致悬空引用 4. '''混淆引用和指针语法''':引用使用<code>.</code>而不是<code>-></code> == 性能考虑 == 引用通常比指针更高效,因为: * 编译器可以更好地优化引用 * 不需要空值检查 * 语法更简洁,减少间接访问错误 == 总结 == C++引用是强大的特性,提供了: * 更安全的别名机制 * 更高效的参数传递 * 更简洁的代码表达 * 支持函数式编程风格 理解引用是掌握现代C++的关键基础,特别是在使用标准库和设计高效API时。 <mermaid> graph TD A[声明引用] --> B[必须初始化] B --> C[不可重新绑定] C --> D[无空引用] D --> E[自动解引用] E --> F[常用于函数参数] F --> G[可用于返回值] G --> H[C++11右值引用] </mermaid> 引用关系可以用数学表示为:<math>ref \equiv var</math>,即引用<math>ref</math>等价于变量<math>var</math>。 [[Category:编程语言]] [[Category:C++]] [[Category:C++ 引用]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)