首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

函数返回引用解决方案

2012-05-22 
函数返回引用学习函数模版时,有如下代码。#include iostream#include stringusing namespace stdtempl

函数返回引用
学习函数模版时,有如下代码。
#include <iostream>
#include <string>
using namespace std;
template <class T>
const T& max(const T& x,const T&y)//个人觉得返回的引用没什么作用!!!
{
return x < y ? y : x;
}
void main()
{
int i1 = 3;
int i2 = 7;
cout << "Maxium is: " <<max(i1,i2) << endl;

float f1 = 22.5;
float f2 = 12.3;
cout << "Muxium is: " << max(f1,f2) << endl;

string s1 = "test1";
string s2 = "test2";
cout << "Maxium is: " << max(s1,s2) << endl;
}
我的问题
1)T& max这个函数个人觉得因为参数已经是引用了,所以这个函数用的就是实参,所以再返回一个引用,感觉没什么作用,也就是直接T max(const T& x,const T&y),也可以,不知道对不对?
2)string s1 = "test1";
string s2 = "test2";
这两个参数是如何比较大小的?

[解决办法]
你传入的是引用,返回的是引用符合规范,令:传入引用是为了减少临时变量的长生
[解决办法]
template<>
string & max (const string & x,const string & y)
{
if(strcmp(x.c_str() , y.c_str())>0 )
return x;
else
return y;
}
[解决办法]
如果需要用到返回值的时候还是有区别的,从第一个字符开始比较AscII值,如果相等继续下一个,否则不执行下一个字符比较,直接返回。
[解决办法]
3.比较大小:字典序,和strcmp一样
[解决办法]

探讨

引用:
你传入的是引用,返回的是引用符合规范,令:传入引用是为了减少临时变量的长生

仅仅是为了符合规范吗?

[解决办法]
问题1. 理论上来说是可以的。楼主不妨做一个实验,将返回类型改为T,同时给T增加一个析构函数,在该析构函数中增加一个输出语句,比如cout << "destructor" << endl;,看看destructor是否会被输出;再将返回类型改为T&,在看看destructor是否会被输出。

请楼主参考下面的代码(为了代码方便起见,去掉了相关的const,和讨论楼主的问题没有直接关系):
C/C++ code
#include <iostream>#include <string>using namespace std;template <typename T>T MAX(T& x, T& y)//个人觉得返回的引用没什么作用!!!{    return x < y ? y : x;}class A{private:    int a;public:    A(int a):a(a)    {    };    bool operator < (const A& t)    {        if(a - t.a < 0) return 1;        else            return 0;    }    friend ostream& operator << (ostream&, const A&);    ~A()    {        cout << "destructor" << endl;    }};ostream& operator << (ostream& os, const A& c){    os << c.a;    return os;}void main(){    int i1 = 3;    int i2 = 7;    cout << "Maxium is: " << MAX<int>(i1, i2) << endl;    float f1 = 22.5;    float f2 = 12.3;    cout << "Muxium is: " << MAX<float>(f1, f2) << endl;    string s1 = "test21";    string s2 = "test2";    cout << "Maxium is: " << MAX<string>(s1, s2) << endl;    A a1(30);    A a2(20);    cout << "Maxium is: " << MAX<A>(a1, a2) << endl;    cout << "=====================" << endl;}
[解决办法]
只是为了防止临时变量,如果返回值不是相当底层或者是大的结构体之类的化,除了规范并没有其他用途。如果你不用&引用,其会产生一个临时变量用来存储值,而你用的值就是临时变量的值,
[解决办法]
而当使用&后其会根据代码找到你所引用的是什么值,而引用就是相当于变量本身,也就是你传入的&a , 或 &b , 所引用的变量值,编译期也就没有必要再创建临时变量了,这就是差别
[解决办法]
2)string s1 = "test1";
string s2 = "test2";


这两个参数是如何比较大小的?

由于string类已经重载了>、<、=号,所以可以直接比较大小。
其实重载函数里也是先用c_str()这个函数来把string对象转换成
C字符串再比较的吧
[解决办法]

探讨

C++Primer第四版有如下的话:P215
返回非引用类型:函数的返回值用于初始化在调用函数处创建的临时对象。用函数返回值初始化临时对象与用实参初始化形参的方法是一样 的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。且其返回值既可以是局部对象,也可以是求解表达式的结果。
这里“临时对象”是什么?是不是形参被分配内存后的东东?怎么会"将函数返回值复制给临时对象"?
……

[解决办法]
楼主可以去研究一下 effective C++ 这本书的 item2 item19 item22 你的问题就全解开了

热点排行