函数返回引用
学习函数模版时,有如下代码。
#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一样
[解决办法]
#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字符串再比较的吧
[解决办法]