关于返回引用的问题,关于模板的问题,关于返回const类型的问题

kevin820601 2007-04-15 07:52:14
#include<iostream>
#include<fstream>
using namespace std;
template<class T>
inline const T& max(const T& a, const T& b)
{
return a<b ? b:a;
}
int main()
{
int a,b=9;
a=3;
cout<<max(a,b)<<endl;
return 0;
}
问题1:程序编译不过去,为什么?
问题2:返回引用会在内存上有什么不能,参数为引用当然好解释。
问题3:返回const什么实际的意义
...全文
162 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlbdan 2007-04-15
  • 打赏
  • 举报
回复
问题1:程序编译不过去,为什么?

名字冲突了,把max改成mmax或其它即可

问题2:返回引用会在内存上有什么不能,参数为引用当然好解释。

当在函数体内写一个局部变量时,不能用引用来返回,而为返回的时候,局部变量已经消失,返回的将是垃圾

问题3:返回const什么实际的意义

防止返回的值被修改.特别是用引用来接收返回值,对引用的修改可以直接影响到内部变量

al0n9 2007-04-15
  • 打赏
  • 举报
回复
1。与标准库中的max冲突,所以导致解析函数调用时多义。
2。不能返回函数内局部变量的引用。或者说,不能返回栈对象的引用。因为函数结束的时候,栈对象已经过了生存有效期,对象已经被析构,所以返回一个到局部变量的引用,后面访问的时候,会出错的。
3。返回const值,可以保证返回的对象不能做为左值。
比如说:
class myClass{
}
如果我们重载了operator+,
const myClass& operator+(const myClass& lhs, const myClass& rhs)
{
......
}
如果上面函数返回的值不是const,那么就可以有下面的合法表达式:
myClass val1, val2, val3, val4;
val1 + val2 = val3 + val4;
这种写法不符合一般的语义表达,是应该避免的。通过让operator+返回一个const,就可以避免上面的情况
snprintf 2007-04-15
  • 打赏
  • 举报
回复
using namespace std;
换成
using std::cout;
using std::endl;
因为std里面有个max, 会冲突.

如果模板是以 自定义类型 实例化, 调用时可省去调用拷贝构造函数的开销. 但不能返回函数内的局部变量, 最好不返回函数内的静态变量.

返回const 禁止调用函数内修改被调用函数返回值.

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧