关于C++中的引用
来源:互联网 发布:索尼rx100一代知乎 编辑:程序博客网 时间:2024/04/30 22:10
引用的定义
C++加入了“引用”这种神奇的东西,其解释是:“引用为对象起了另一个名字引用类型引用另外一种类型”。
定义:
int i = rand();int &ri = I; // 定义引用时必须初始化,否则将是非法行为
“定义引用时,程序把引用和它的初始值绑定(bind)在一起,而不是将初始值拷贝给引用,一旦初始化完成,引用将和它的初始值对象一直绑定在一起。”
按我的理解,这东西和指针有许多相似之处,指针在我看来从某种程度上来说就是一个变量的别名,当然其他的一些高级功能例如指针移动等得另说。
引用的使用
初学引用的时候;觉得这玩意很没用:为一个变量起另一个名字有什么用?(卖萌)。实际上,引用这个东西在程序中对于数据传递有十分重要的意义。举个栗子:
vector<int> ivec = {0,1,2,3,4,5,6,7,8,9}; for (auto x: ivec){}; //这样使用范围for语句将不能对ivec的内容做任何修改 for (auto &rx: ivec){}; //使用引用即可对ivec的元素进行修改
需要指出的是,范围for在对容器、数组等数据集合进行调用时更像是一个函数,因为传入的数据并不是其本身,而是一个对原数据的复制。for (int x: ivec)就是如此,下面函数块中使用的x实际上是对ivec元素的复制而不是其本身。而如果使用引用(for (auto &rx: ivec)),由于此时的declaration并不是一个变量而是一个引用,因此此时的循环变量可以理解为是指向该数据集合的一个指针,自然可以对原始数据做修改。
调用函数时传值(传引用)调用与其类似:
void some_function1 (int &ri){}; void some_function2 (int i){}; int main () { int a = rand(); some_function1 (a); some_funciont2 (a); return 0;}
在这里,虽然对两个不同的函数传入的都是同一个变量a,但是在函数体内却不同,some_function1的传入值虽然是a,但是在函数体内ri被定义成了一个指向a的引用,所以ri是a的别名,也可以理解为ri就是a,各种意义上的。而some_function2接受的变量实际上是a的一份拷贝,因此在some_funcion2内对i做的所有修改不会对其调用者中的a产生影响。
decltype中的引用
一个比较容易混淆的地方是,引用并不是一个int或者double这样的类型,引用就是引用,自身就是一个基本数据类型。引用从来都作为其所指对象的同义词出现,只有在decltype处例外。在某些情况下,如果对一个表达式使用decltype,并且该表达式的值是一个可赋值的左值的话,decltype的类型将是引用。需要注意的是,如果给一个变量加上了括号,那就是一个表达式,如:
int a; decltype(a); // 得到int decltype((a)); // 得到引用
decltype((variable))的结果永远是引用,而decltype(variable)的结果只有当variable本身就是一个引用时才是引用。
- 关于参数中的引用
- 关于c++中的引用
- 关于C++中的引用
- 关于Python中的引用
- c++::关于引用
- C++:关于引用
- c语言中的引用
- 【C++】:C++中的引用
- 关于C语言中的强符号、弱符号、强引用和弱引用
- 关于C#中的弱引用
- 关于oc中的强弱引用
- 关于C#中的弱引用
- 关于C++中的引用传递
- 关于C++引用C,C引用C++,extern的使用
- 关于Excel中的相对引用,绝对引用,和混合引用!
- 深入探讨C 中的引用
- 深入探讨C 中的引用
- C++/CLI中的引用类型
- 特立独行的在输入法弹起的时候将指定控件往上推
- cocos2d-x IOS 和Android播放视频(包括网络视频)
- Makefile总结
- could not get next sequence value
- NSDate添加常用Category,用于得到是否是今天,昨天等
- 关于C++中的引用
- 迁移到Java8示例之filter
- 读书笔记数据科学入门————Python快速入门
- zmap安装实践
- Gson解析Json工具类
- spring4的定时任务
- 软件工程视频总结(二)
- BMP位图数据
- HIVE 窗口及分析函数 应用场景