跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 引用声明
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++引用声明 = == 简介 == 在C++中,'''引用'''(Reference)是一个已存在变量的别名,它为变量提供了另一个名称。引用在声明时必须初始化,且一旦绑定到一个变量后,就不能再绑定到其他变量。引用在函数参数传递、返回值优化等场景中非常有用,能够提高代码的可读性和效率。 引用与指针类似,但有以下主要区别: * 引用必须在声明时初始化,指针可以稍后初始化。 * 引用不能为NULL,指针可以。 * 引用一旦绑定到一个变量后,就不能改变,指针可以重新指向其他变量。 == 基本语法 == 引用声明的语法如下: <syntaxhighlight lang="cpp"> 数据类型 &引用名 = 变量名; </syntaxhighlight> 例如: <syntaxhighlight lang="cpp"> int x = 10; int &ref = x; // ref是x的引用 </syntaxhighlight> == 详细解释 == === 引用的特性 === 1. '''必须初始化''':引用在声明时必须绑定到一个变量。 <syntaxhighlight lang="cpp"> int y = 20; int &ref2; // 错误:引用必须初始化 int &ref2 = y; // 正确 </syntaxhighlight> 2. '''不可重新绑定''':引用一旦初始化后,就不能再绑定到其他变量。 <syntaxhighlight lang="cpp"> int a = 5, b = 10; int &ref = a; ref = b; // 这不是重新绑定,而是将b的值赋给a </syntaxhighlight> 3. '''引用作为别名''':对引用的操作等同于对原变量的操作。 <syntaxhighlight lang="cpp"> int num = 42; int &r = num; r = 100; // num的值现在为100 </syntaxhighlight> === 常量引用 === 可以声明对常量的引用,此时不能通过引用修改原变量的值。 <syntaxhighlight lang="cpp"> const int &cref = num; // 常量引用 // cref = 50; // 错误:不能通过常量引用修改值 </syntaxhighlight> == 代码示例 == === 基本示例 === <syntaxhighlight lang="cpp"> #include <iostream> using namespace std; int main() { int original = 7; int &ref = original; cout << "original: " << original << endl; // 输出: 7 cout << "ref: " << ref << endl; // 输出: 7 ref = 15; cout << "After modification:" << endl; cout << "original: " << original << endl; // 输出: 15 cout << "ref: " << ref << endl; // 输出: 15 return 0; } </syntaxhighlight> === 函数参数传递 === 引用常用于函数参数传递,避免拷贝大对象: <syntaxhighlight lang="cpp"> #include <iostream> using namespace std; void swap(int &a, int &b) { int temp = a; a = b; b = temp; } int main() { int x = 10, y = 20; cout << "Before swap: x=" << x << ", y=" << y << endl; swap(x, y); cout << "After swap: x=" << x << ", y=" << y << endl; return 0; } </syntaxhighlight> 输出: <pre> Before swap: x=10, y=20 After swap: x=20, y=10 </pre> == 实际应用场景 == === 避免对象拷贝 === 当传递大型对象到函数时,使用引用可以避免昂贵的拷贝操作: <syntaxhighlight lang="cpp"> void processLargeObject(const LargeObject &obj) { // 处理obj,避免拷贝 } </syntaxhighlight> === 函数返回引用 === 函数可以返回引用,但要注意不能返回局部变量的引用: <syntaxhighlight lang="cpp"> int &getElement(int arr[], int index) { return arr[index]; // 返回数组元素的引用 } int main() { int array[5] = {1, 2, 3, 4, 5}; getElement(array, 2) = 10; // 修改array[2]为10 return 0; } </syntaxhighlight> == 引用与指针的比较 == <mermaid> mindmap root((引用 vs 指针)) 语法 引用: "int &r = x;" 指针: "int *p = &x;" 初始化 引用: 必须初始化 指针: 可以稍后初始化 可修改性 引用: 不能重新绑定 指针: 可以重新指向 空值 引用: 不能为NULL 指针: 可以为NULL 间接访问 引用: 自动解引用 指针: 需要*操作符 </mermaid> == 注意事项 == * 不要返回局部变量的引用 * 引用不能指向临时对象(除非是常量引用) * 引用通常用于函数参数和返回值,以提高效率 == 进阶主题 == === 引用折叠 === 在模板和完美转发中会涉及引用折叠规则: <math> \begin{align} T\&\ \&\ &\rightarrow\ T\& \\ T\&\ \&\&\ &\rightarrow\ T\& \\ T\&\&\ \&\ &\rightarrow\ T\& \\ T\&\&\ \&\&\ &\rightarrow\ T\&\& \end{align} </math> === 右值引用 === C++11引入了右值引用(Rvalue reference),用于实现移动语义: <syntaxhighlight lang="cpp"> int &&rref = 42; // 右值引用 </syntaxhighlight> == 总结 == C++引用是一种强大的特性,它: * 提供了变量的别名 * 必须初始化且不可重新绑定 * 常用于函数参数传递和返回值 * 比指针更安全,语法更简洁 * 在C++11及以后版本中,右值引用支持移动语义 正确使用引用可以写出更高效、更易读的C++代码。 [[Category:编程语言]] [[Category:C++]] [[Category:C++ 引用]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)