C++引用

C++引用

图:LEGO小人仔

Guderian出品

笔记整理自《北京大学公开课:C++面向对象程序设计》

C++C相比,多了很多独特的内容,其中有很多都是为了实现面向对象编程范式而引入的,C++的引用就是其一。

引用的概念

  • 定义一个引用,并将其初始化为引用某个变量的通用写法:类型名 & 引用名 = 某变量名
  • 某个变量的引用,等价于这个变量,相当于该变量的一个别名
1
2
3
4
5
6
7
8
int n = 7;
int & r = n;
//r引用了n,r的类型是int &
r = 4;
cout << r; //输出4
cour << n; //输出4
n = 5;
cout << n;
  • 定义引用时一定要将其初始化成引用某个变量,而不像指针可以指向某个变量也可以不指向某个变量
  • 初始化后,它就一直引用该变量,不会再引用别的变量了(引用是从一而终的)
  • 引用只能引用变量,不能引用常量和表达式
1
2
3
4
5
6
7
double a = 3, b = 5;
double & r1 = a;
double & r2 = r1; //r2也引用a
r2 = 10;
cout << a << endl; //输出10
r1 = b; //r1并没有引用b
cout << a << endl; //输出5

引用的应用

C中,如何编写交换两个整型变量值的函数?

  • 这样写吗?
1
2
3
4
5
6
7
8
void swap(int a, int b)
{
int tmp;
tmp = a; a = b; b = tmp;
}
int n1, n2;
swap(n1, n2);
//n1, n2的值没有被交换

这是错误的,改变形参不会改变实参。

  • 或者用指针?
1
2
3
4
5
6
7
8
void swap(int *a, int *b)
{
int tmp;
tmp = *a; *a = *b; *b = tmp;
}
int n1, n2;
swap(& n1, & n2); //取地址
//n1, n2的值被交换

正确,但丑陋!

那么C++中,如何编写交换两个整型变量值的函数?

引用作为参数

C++示例:交换两个整数

1
2
3
4
5
6
7
8
void swap(int & a, int & b)	//a就是n1,b就是n2
{
int tmp;
tmp = a; a = b; b = tmp;
}
int n1, n2;
swap(n1, n2);
//n1, n2的值被交换

引用作为返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
int n = 4;
int & SetValue() { return n; }

int main()
{
//神奇之处,对函数的返回值进行赋值
SetValue() = 40;
//然而它究竟有什么作用呢?我还没想好...
cout << n;
//输出:40

return 0;
}

注意被引用的对象不能超过作用域,返回一个局部变量的引用是不合法的,但是,可以返回一个静态类型变量的引用。

常引用

定义引用时,在前面加const关键字即为“常引用”。

1
2
int n;
const int & r = n;
注意不能通过常引用去修改其引用的内容!
1
2
3
4
int n = 100;
const int & r = n;
r = 200; //err
n = 300; //ok

常引用和非常引用的转换

  • const T &T &是不同的类型(千万要注意!!!)
  • T &类型的引用或T类型的变量可以用来初始化const T &类型的引用
  • const T类型的常变量和const T &类型的引用则不能用来初始化T &类型的引用,除非进行强制类型转换

参考并整理自《C++面向对象设计》郭炜,北京大学,感谢原作者!编辑时有删改

本文标题:C++引用

文章作者:G-SS-Hacker

发布时间:2019年12月07日 - 10:51:15

最后更新:2020年01月25日 - 20:47:04

原始链接:https://G-SS-Hacker.github.io/C-引用/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。