关于const的函数引用传递,请赐教

SolarJupiter 2012-03-02 09:35:38
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
例如:
class A
{
A & operate = (const A &other); // 赋值函数(请问这里实现什么?)
};
A a, b, c; // a, b, c 为A 的对象

a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法(这两个赋值有什么问题?)
如果将赋值函数的返回值加const 修饰,那么该返回值的内容不允许被改动。上例中,语句 a = b = c 仍然正确,但是语句 (a = b) = c 则是非法的。
...全文
182 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lirunfa 2012-03-03
  • 打赏
  • 举报
回复
A & operate = (const A &other); // 赋值函数(请问这里实现什么?)
这里是等号操作符,你可以把它看成是一个函数 即, A=B可以看成 A.f(B),返回值是用于链式赋值
例如 A=B=C可以看做 先 B.f(C) 假设返回的引用是D,接下来就是 A.f(D)
(A=B)=C 则是先A.f(B)然后再跟C结合
如果返回值加了const, A=B=C是没问题的
但是(A=B)=C 假设A.f(B)返回D, D是const的 即不能被修改, 但是下一步却是 D.f(C)要用C来赋值给D,是不可以的
allIdover 2012-03-03
  • 打赏
  • 举报
回复
[Cpp.程序设计原理与实践].(机械工业出版社)有深刻的将这个问题,当初我看了豁然开朗,只是现在又忘记了。。。
另外,如果lz没看过这本书的话,建议看看,里面很多东东将的很精彩
oniisama 2012-03-03
  • 打赏
  • 举报
回复
a = b = c相当于a = (b = c),b = c返回一个右值,把右值赋给a没有问题。但是(a = b) = c的话,a = b返回一个右值,赋值给右值是不合法的。
bsnry 2012-03-03
  • 打赏
  • 举报
回复
不是吧,const成员函数,返回值又是一个引用 很可能导致错误,比如:返回类的成员数据的时候,那么就会错误

改成:

cosnt成员函数,返回值是cosnt引用。


我猜测你说的是: 返回值是cosnt引用这种情况

我根据你说的,也写了一个

class A
{
public:
A const & operator = (const A &other) const // 赋值函数(请问这里实现什么?)
{
return *this;
}
};

int main()
{
A a,b,c;
(a=b)=c;
return 0;
}

结果可以通过,,, 没报错




[Quote=引用 9 楼 cxsjabcabc 的回复:]

不知道大家怎么分析的;
根本没任何问题;
gcc 4.2表示代码没有问题;

返回值加const的话,(a = b) = c; 代码有问题是正常的,因为(a = b)返回的是一个const对象,用c来赋值有问题;
[/Quote]
程序员小迷 2012-03-03
  • 打赏
  • 举报
回复
不知道大家怎么分析的;
根本没任何问题;
gcc 4.2表示代码没有问题;

返回值加const的话,(a = b) = c; 代码有问题是正常的,因为(a = b)返回的是一个const对象,用c来赋值有问题;

三尺青萍 2012-03-03
  • 打赏
  • 举报
回复
class A
{
A & operate = (const A &other); // 赋值函数(请问这里实现什么?)
};
A a, b, c; // a, b, c 为A 的对象

a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法(这两个赋值有什么问题?)
你们用的什么编译器啊!上面的示例visual c++编译出现N个错误!operate是什么意思,说能解释一下程序吗?Thank you very much!新手求解
bsnry 2012-03-02
  • 打赏
  • 举报
回复
这两个赋值有什么问题?

答案: 你试试,去了引用,那么会报错的, 没引用(a=b)=c,肯定出错。。

楼主试试



[Quote=引用楼主 houbin01 的回复:]
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
例如:
class A
{
A & operate = (const A &other); // 赋值函数(请问这里实现什么?)
};
A a, b, c; // a, b, c 为A 的对象

a = b = c; // 正常的链式赋值
(a = b) = c;……
[/Quote]
漫步者、 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 houbin01 的回复:]
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
例如:
class A
{
A & operate = (const A &other); // 赋值函数(请问这里实现什么?)
};
A a, b, c; // a, b, c 为A 的对象

a = b = c; // 正常的链式赋值
[/Quote]

A & operate = (const A &other); //简单的复制;
(a = b) = c;//复制的顺序不同;
如果将赋值函数的返回值加const 修饰,那么该返回值的内容不允许被改动
//返回引用的const那么是被编译器禁止修改const的数据的。
modicum_ck 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kuyucman 的回复:]
(a = b) = c 则是非法的。

是因为a=b是赋值,而后者,就是给const变量赋值了,违背定义了
[/Quote]
++
(a = b)返回的是const,所以再进行赋值就出错了。
东莞某某某 2012-03-02
  • 打赏
  • 举报
回复
(a = b) = c 则是非法的。

是因为a=b是赋值,而后者,就是给const变量赋值了,违背定义了

64,654

社区成员

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

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