函数返回引用类型
来源:互联网 发布:木枪托在淘宝怎么搜索 编辑:程序博客网 时间:2024/04/19 16:43
今天在看STL中vector容器的使用,由msdn中vecter::at()函数说明引发的几点思考。
msdn中at函数声明为:
reference at( size_type _Pos);const_reference at( size_type _Pos) const;使用示例为:
// vector_at.cpp// compile with: /EHsc#include <vector>#include <iostream>int main( ){ using namespace std; vector <int> v1; v1.push_back( 10 ); v1.push_back( 20 ); const int &i = v1.at( 0 ); int &j = v1.at( 1 ); cout << "The first element is " << i << endl; cout << "The second element is " << j << endl;}备注:
如果 at 的返回值赋给 const_reference,不能修改向量对象。 如果 at 的返回值赋给 reference,可以修改向量对象。
以上内容来自:MSDN
函数声明返回类型为引用,而我有过int i=v1.at(0)的经验,于是我猜想返回引用的函数声明,在调用时可以不为值类型。
验证:
#include "stdafx.h"#include <iostream> using namespace std; int& add(int n){n=n+1;return n;}int main(){int a=add(2);cout<<a<<endl;system("pause");}
运行结果:3
函数编译链接通过,运行正确,说明猜想正确。反过来我想返回为值类型函数是否可以在调用的时候返回一个引用类型。
验证如下:#include "stdafx.h"#include <iostream> using namespace std; int add(int n){n=n+1;return n;}int main(){int& a=add(2);cout<<a<<endl;system("pause");}函数编译出错,错误提示:error C2440: “初始化”: 无法从“int”转换为“int &”
说明不能值类型赋给引用型。
综上:由int&到int转变可行,由int到int&转变不可行。
#include "stdafx.h"#include <iostream> using namespace std; int& add(int n){n=n+1;return n;}int main(){int& a=add(2);cout<<a<<endl;system("pause");}以上程序运行结果为:
让偶吃惊,这是嘛回事呢?
分析:因为引用相当与变量别名,它和关联的变量是同一事物,以上add函数返回n(return n),说明函数返回值是变量n的别名,它和n是相同的。
在主函数中执行玩int &=add(2)语句后,n的作用范围只在函数内,因此执行此句后,n(相当于地址)中所存内容为随机数。而a是n的别名,它与n的值相同,
所以输出了以上结果,而不是我们想要的3。
解决方案:改变n的作用域,将其定义为静态变量。
#include "stdafx.h"#include <iostream> using namespace std; static int n=2; int& add(){n=n+1;return n;}int main(){int& a=add();cout<<a<<endl;n=n+1; //改变n值cout<<a<<endl; //a值亦变,说明a与n确实是同一事物system("pause");}
0 0
- 函数返回引用类型
- 函数返回引用类型
- 返回引用类型的函数
- 引用作为函数返回类型
- 函数返回值:引用类型和非引用类型
- c++:函数返回引用类型和非引用类型
- C++基础---有返回值类型函数(返回引用类型)
- 函数返回引用和指针类型
- 函数返回值为引用类型
- 函数返回引用和指针类型
- 函数返回引用类型的值
- 将“引用”作为函数返回值类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- C++函数的返回值问题(1)——返回引用类型&非引用类型
- C++函数的返回值——返回引用类型&非引用类型
- 第三层交换机和路由器的区别
- MongoDB的模糊查询
- CArchive 飞鸽传书 如何实现文件的序列号存取
- c++ 多线程编程 网络编程 fork
- PAT 1001. 害死人不偿命的(3n+1)猜想
- 函数返回引用类型
- 获取itunes app 信息
- 34.笔记
- 项目二。教师兼干部类
- 可下拉的PinnedHeaderExpandableListView的实现
- C++类中的静态成员变量和静态成员函数的作用
- struts2配置包范围国际化资源文件--包范围
- 设计模式一之策略模式(strategy)
- 《程序员面试宝典》螺旋队列坐标输出