【入门级-C++程序设计:11、指针与引用-引 用】

引用是C++中一种重要的复合类型,它为已存在的变量提供了一个别名。引用本质上是对另一个变量的间接访问方式,但与指针不同,引用提供了更安全、更直观的语法。

基本语法

类型 &引用名 = 被引用变量;

举例说明:

int x = 10;

int &ref = x; // ref是x的引用(别名)

ref = 20; // 给ref赋值为20,现在x的值变为20

cout << x; // 输出20

下面通过几个具体的例子来详细说明C++中引用的使用和特性:

示例1:基本引用使用

#include

using namespace std;

int main() {

int num = 42;

int &ref = num; // ref是num的引用(别名),初始化,声明时绑定到有效变量num

cout << "num: " << num << endl; // 输出42

cout << "ref: " << ref << endl; // 输出42

ref = 100; // 通过引用修改值

cout << "修改后 num: " << num << endl; // 输出100

// 验证它们的内存地址相同

cout << "&num: " << &num << endl;

cout << "&ref: " << &ref << endl; // 输出相同的地址

return 0;

}

输出:

num: 42

ref: 42

修改后 num: 100

&num: 0x7ffd4a3b5a24

&ref: 0x7ffd4a3b5a24

说明:

ref 和 num 是同一块内存的别名,修改 ref 等同于修改 num。

引用和原变量的地址相同。

示例2:引用必须在声明时初始化

int main() {

int x = 10;

int &ref1 = x; // 正确:声明时初始化

int &ref2; // 错误:引用必须初始化(编译报错)

return 0;

}

说明:

引用必须在定义时绑定到一个已存在的变量,不能先声明后赋值。

示例3:函数参数传递(避免拷贝)

#include

using namespace std;

void swap(int &a, int &b) {

int temp = a;

a = b;

b = temp;

}

int main() {

int m = 5, n = 10;

swap(m, n); // 传递引用,直接修改原值

cout << "m: " << m << ", n: " << n << endl; // 输出 m: 10, n: 5

return 0;

}

输出:

m: 10, n: 5

说明:

函数参数使用引用时,可以直接修改实参的值(类似指针但语法更简洁)。

避免了值传递时的拷贝开销(对大型对象尤其重要)。

示例4:引用 vs 指针

#include

using namespace std;

int main() {

int val = 50;

// 指针方式

int *ptr = &val;
ptr = 60; // 需要解引用操作符( )

// 引用方式

int &ref = val;

ref = 70; // 无需解引用,直接使用

cout << "val: " << val << endl; // 输出70

return 0;

}

说明:

引用比指针更安全(无空引用风险)且语法更直观。

示例5:常量引用(避免修改)

#include

using namespace std;

void printValue(const int &r) {

// r = 100; // 错误:不能通过常量引用修改值

cout << "值: " << r << endl;

}

int main() {

int x = 42;

printValue(x); // 安全传递,避免拷贝

return 0;

}

说明:

const int & 表示只读引用,适用于不希望函数修改实参的场景。

常用于传递大型对象(如std::string)以避免拷贝开销。

示例6:引用不能重新绑定

int main() {

int a = 1, b = 2;

int &ref = a;

ref = b; // 这是将b的值赋给a,而非让ref改为引用b!

cout << a; // 输出2(a的值被修改为2)

return 0;

}

说明:

引用一旦初始化后,不能再绑定到其他变量。ref = b 是赋值操作,而非重新绑定。

引用的特点总结

别名性质:引用不是独立的对象,它只是已存在变量的另一个名字,引用和原变量共享同一内存地址。

做函数参数:引用传递可避免拷贝,且能修改实参(若需只读则加const)。

必须初始化:引用在声明时必须初始化,声明时需绑定到有效变量;且之后不能改变绑定的对象,减少了意外修改的风险。

安全性(无空引用):引用必须绑定到一个有效的对象(指向有效对象),不存在"空引用",避免了空指针风险。

自动解引用:使用引用时不需要特殊语法,就像使用普通变量一样,不需要解引用操作符(*)。

相关推荐
Websites25 分钟前
Hyperf 百度翻译接口实现方案
开发语言·自然语言处理·php·自动翻译
John_ToDebug2 小时前
JS 与 C++ 双向通信实战:基于 WebHostViewListener 的消息处理机制
前端·c++·chrome
岁忧2 小时前
(LeetCode 每日一题) 1780. 判断一个数字是否可以表示成三的幂的和 (数学、三进制数)
java·c++·算法·leetcode·职场和发展·go
常乐か3 小时前
VS2022+QT5.15.2+OCCT7.9.1的开发环境搭建流程
开发语言·qt·opencascade
Evand J4 小时前
【MATLAB例程】滑动窗口均值滤波、中值滤波、最小值/最大值滤波对比。附代码下载链接
开发语言·matlab·均值算法
IT毕设实战小研4 小时前
基于SpringBoot的救援物资管理系统 受灾应急物资管理系统 物资管理小程序
java·开发语言·vue.js·spring boot·小程序·毕业设计·课程设计
yzx9910134 小时前
PHP 开发全解析:从基础到实战的进阶之路
开发语言·php
rhythmcc4 小时前
【visual studio】visual studio配置环境opencv和onnxruntime
c++·人工智能·opencv