C++ 核心编程 - 引用

2.1 引用的基本使用

作用: 给变量起别名,语法为 数据类型 &别名 = 原名

int main(){
    int a = 100;
    int &b = a;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    b = 111;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;

    return 0;
}
a = 100
b = 100
a = 111
b = 111

2.2 注意事项

引用必须初始化,且在初始化后,其不可以改变。

int main(){
    int a = 10, b = 20;

    // int &c 引用必须初始化
    int &c = a;
    c = b; // 这是赋值操作,不是更改引用

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;

    return 0;
}
a = 20
b = 20
c = 20

2.3 引用作函数参数

作用: 函数传参时,可以利用引用的技术让形参修饰实参,进而可以简化指针修改实参的操作。

// 1. Value transfer 值传递
void swap_by_value(int a, int b){
    int temp = a;
    a = b;
    b = temp;
}

// 2. Address transfer 地址传递
void swap_by_addr(int *a, int *b){
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 3. Cite transfer 引用传递
void swap_by_cite(int &a, int &b){
    int temp = a;
    a = b;
    b = temp;
}

int main(){
    int a = 10, b = 20;

    swap_by_value(a, b);
    cout << "a = " << a << "\t" << "b = " << b << endl;

    swap_by_addr(&a, &b);
    cout << "a = " << a << "\t" << "b = " << b << endl;

    swap_by_cite(a, b);
    cout << "a = " << a << "\t" << "b = " << b << endl;

    return 0;
}
a = 10  b = 20
a = 20  b = 10
a = 10  b = 20

总结:通过引用参数传递产生的效果同按地址传递是一样的,并且引用的语法更加清楚简单。

2.4 引用作函数返回值

作用: 引用是可以作为函数的返回值存在的,但有两个注意事项

示例1:不要返回局部变量引用

int & func(){
    int a = 10;
    return a; // 局部变量存放于四区中的栈区
}

int main(){
    int &p = func();

    cout << p << endl;

    return 0;
}
main.cpp: In function ‘int& func()’:
main.cpp:7:12: warning: reference to local variable ‘a’ returned [-Wreturn-local-addr]
    7 |     return a;
      |            ^
main.cpp:6:9: note: declared here
    6 |     int a = 10;
      | 

示例2:函数调用作为左值

int & func(){
    static int a = 10; // 静态变量存放于全局区,程序结束后由系统释放
    return a;
}

int main(){
    int &ref = func();
    cout << "ref = " << ref << endl;

    func() = 10000; // 如果函数返回值为引用,即该函数调用可以作为左值
    cout << "ref = " << ref << endl;

    return 0;
}
ref = 10
ref = 10000

2.5 引用的本质

本质:C++ 内部实现是一个指针常量

// int* const ref = &a;
void func(int& ref){
	ref = 100; // *ref = 100
}

int main(){
	int a = 10;
	int& ref = a; // int* const ref = &a
	
	ref = 20; // *ref = 20
	cout << "a = " << a << "\t" << "ref = " << ref << endl;

	func(a);
    cout << "a = " << a << "\t" << "ref = " << ref << endl;

	return 0;
}
a = 20  ref = 20
a = 100 ref = 100

结论:C++ 推荐使用引用技术,因为语法方便,引用的本质是指针常量,但是其所有的指针操作编译器都帮我们做了。

2.6 常量引用

作用: 常量引用主要用来修饰形参,防止误操作;在函数形参列表中,可以加 const 修饰形参,防止形参改变实参。

void showValue(const int& v) {
	// v += 10;
	cout << "v = " << v << endl;
}

int main() {
	// int& ref = 10;  
	const int& ref = 10;
	cout << "ref = " << ref << endl;

	int a = 100;
	showValue(a);

	return 0;
}
ref = 10
v = 100
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_leoatliang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值