免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8234 | 回复: 14
打印 上一主题 下一主题

[C++] 不理解为什么会有const类型的返回值,它有什么作用呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-18 17:50 |只看该作者 |倒序浏览
  1. class A {
  2.   int i;
  3. public:
  4.   A(int ii) {i = ii;}
  5. }

  6. A f() {
  7.   return A();
  8. }

  9. int main(){
  10.   f() = A(1);
  11. }
复制代码
书上说返回一个内部类型时,const没有意义;返回一个用户类型时,const说明该返回值不能当做左值。
我的疑问是:什么情况下函数的返回值又被当做左值的需求呢?

论坛徽章:
0
2 [报告]
发表于 2012-07-18 18:17 |只看该作者
当函数的返回值是引用的时候,不希望调用者修改这个返回值,就用const。一般是不建议函数返回引用的返回值的

论坛徽章:
0
3 [报告]
发表于 2012-07-18 18:50 |只看该作者
hengshan 发表于 2012-07-18 18:17
当函数的返回值是引用的时候,不希望调用者修改这个返回值,就用const。一般是不建议函数返回引用的返回值的 ...


我的疑问是:什么情况下函数的返回值又被当做左值的需求呢?

论坛徽章:
0
4 [报告]
发表于 2012-07-18 18:56 |只看该作者
是否我的“左值”理解的不对,函数的返回值只是operator=的一个操作数?

论坛徽章:
0
5 [报告]
发表于 2012-07-18 19:23 |只看该作者
hengshan 发表于 2012-07-18 18:17
当函数的返回值是引用的时候,不希望调用者修改这个返回值,就用const。一般是不建议函数返回引用的返回值的 ...


这么理解对么?
class TA
{
public:
    int& DataI() { return i; }
    TA(int ii = 0){ i = ii;}
private:
    int i;
};

TA f1() {
  return TA();
}

const TA f2() {
  return TA();
}

那么f1() = TA(3);就是ok的
f2() = TA(3);就是不行的

论坛徽章:
1
巨蟹座
日期:2014-03-18 23:44:30
6 [报告]
发表于 2012-07-18 22:57 |只看该作者
你看下 C++ 的有关运算符重载的实现中,大多都返回 const 类型

论坛徽章:
0
7 [报告]
发表于 2012-07-19 09:27 |只看该作者
回复 5# ctsweeper

你说的这也是一种情况,但不是最重要的。重要的是返回引用的时候,调用方容易修改返回值。
比如,

class student{
public:
std::string name;

student & get_stu_info()
{
}

};



student s = get_stu_info();

s->name = "hello";//注意,这里就改掉了,这种做法,是不允许的。


   

论坛徽章:
7
荣誉版主
日期:2011-11-23 16:44:17子鼠
日期:2014-07-24 15:38:07狮子座
日期:2014-07-24 11:00:54巨蟹座
日期:2014-07-21 19:03:10双子座
日期:2014-05-22 12:00:09卯兔
日期:2014-05-08 19:43:17卯兔
日期:2014-08-22 13:39:09
8 [报告]
发表于 2012-07-19 13:31 |只看该作者
  1. char *GetVersion()
  2.     { return “11.2”;}

  3. GetVersion()[1]=’x’;
复制代码

论坛徽章:
0
9 [报告]
发表于 2012-07-19 17:10 |只看该作者
左值和右值属于编译器的概念。简单的说,每一个变量都有两个属性,一个就是左值,一个就是右值了。

右值表示一个变量的数值,左值表示这个变量的地址属性。

我的疑问是:什么情况下函数的返回值又被当做左值的需求呢?
一个最广泛的例子就是连续赋值。比如 a + b = c;
a+b 返回一个新的对象,这个对象不是const的上面的操作就是正确的。是const上面则编译不通过

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2012-07-19 19:41 |只看该作者
r2007 发表于 2012-07-19 13:31
这是一种错误的用法。const char[]不能写的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP