C++ Reference 变量
声明/定义reference variable绝对没有向系统要新的空间来用 ,只是给先前就已经要来的空间取另外一个名字而已(alias).
& 永远不会出现在C 语言变量声明的形参部分. (可以出现在起始值)
在C++ 中, & 出现在程序的运算式中, 要念作"... 的地址"; 出现在变量声明的形参部分, 要念作"... 是一个reference variable".
再强调一次: 不要跟指针混淆:
- int x; int x;
- int *p = &x; int &y = x;
Q: 向系统要了几个空间? 各装什么? 请图示.
出现在变量声明的形参部分当中的& 不影响变量的形参.
Call by reference
记得C语言副程序传递时,每写一个形式参数其实都是在声明/定义一个自动变量吗? 函数的参数列其实也是变量声明/定义的地方 .如果这里放的是reference variable ,可以想像它的意思就是:并未向系统要新的空间,形式参数其实只是实际参数的别名.
结论: C++ 除了call-by-value 外, 还有call-by-reference. 例:
- void swap(int & a, int & b)
- {
- int c;
- c = a;
- a = b;
- b = c;
- }
假设有int x, y; ,则传递给swap(x,y) 会将x与y的内容对调 过来。
Q: printf("%d", x)和printf("%d", x+3)都正确;那么swap(x,y)和 swap(x+3, y+3)呢?结论: "传给reference variable的实际参数必定是..."
Q:为什么数组参数不可以也不需要以参考方式传递?作业:写一个函数itoa,接受以下参数:字串result,整数n,整数r (内定值16).它将n以r-进位印至result内.从 skeleton.c开始修改.可否不要用临时字串?
传递比较大的记录当做副程序参数时, C 语言中习惯上以指针传递, 如果副程序不会修改到这个指针所指到的变量, 则声明成指到常数的指针. 同样的情况, 换作C++, 则习惯以reference variable 传递, 而如果副程序不会修改到这个reference variable 所代表的, 则声明成参考到常数的reference variable .
Q: 将不是const, 不是reference 的参数传给以const & 为参数的副程序, 会不会有问题?
除非函数名称可以明显提示传进去的参数会被修改, 否则避免传递非常数的参考.
传回reference
C语言中,不仅参数传递时发生拷贝的动作,传回参数时亦同.例:设有int min(int x, int y) { return x < y ? x : y; }则min(a, b ) = 3将导致compile-time error.
在C++中,上述函数若改声明为: int & min(int const & x, int const & y); (定义完全不变),则可将传回值作为l-value使用.
结论: 有三种变量可能可以当做reference 传回: 以reference 传入的参数, 用new 要来的变量, 静态变量(包含全域变量与局部的static 变量). 其实道理和传回指针时, "不可以指向已经不存在的东西" 一样.
作业: (x=5) = 3;若出现在.c的程序当中,编译结果如何?若出现在.cc的程序当中,编译结果如何?
最常使用传回reference 的场合:
ostream & operator << (ostream & os, complex c);
请与strcpy 和strcat 等传回指针的函数做比较: 传回值其实都是主程序传进去的东西, 这么做只是为了方便主程序直接把传回值继续拿来传给下一个函数, 不必分成好几次传递.
作业:将stack.c和 complex.c改写为C++程序.简化所有函数的界面,删除所有的参数及传回值中的指针.
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
