今天在看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");
}