关于const的函数引用传递,请赐教,该如何解决
关于const的函数引用传递,请赐教
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
例如:
class A
{
A & operate = (const A &other); // 赋值函数(请问这里实现什么?)
};
A a, b, c; // a, b, c 为A 的对象
a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法(这两个赋值有什么问题?)[u][/u]
如果将赋值函数的返回值加const 修饰,那么该返回值的内容不允许被改动。上例中,语句 a = b = c 仍然正确,但是语句 (a = b) = c 则是非法的。
------解决方案--------------------
(a = b) = c 则是非法的。
是因为a=b是赋值,而后者,就是给const变量赋值了,违背定义了
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
这两个赋值有什么问题?
答案: 你试试,去了引用,那么会报错的, 没引用(a=b)=c,肯定出错。。
楼主试试
------解决方案--------------------
a = b = c相当于a = (b = c),b = c返回一个右值,把右值赋给a没有问题。但是(a = b) = c的话,a = b返回一个右值,赋值给右值是不合法的。
------解决方案--------------------
[Cpp.程序设计原理与实践].(机械工业出版社)有深刻的将这个问题,当初我看了豁然开朗,只是现在又忘记了。。。
另外,如果lz没看过这本书的话,建议看看,里面很多东东将的很精彩
------解决方案--------------------
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,是不可以的
------解决方案--------------------
class A
{
A & operate = (const A &other); // 赋值函数(请问这里实现什么?)
};
A a, b, c; // a, b, c 为A 的对象
a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法(这两个赋值有什么问题?)[u][/u]
你们用的什么编译器啊!上面的示例visual c++编译出现N个错误!operate是什么意思,说能解释一下程序吗?Thank you very much!新手求解
------解决方案--------------------
不知道大家怎么分析的;
根本没任何问题;
gcc 4.2表示代码没有问题;
返回值加const的话,(a = b) = c; 代码有问题是正常的,因为(a = b)返回的是一个const对象,用c来赋值有问题;
------解决方案--------------------
不是吧,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;
}
结果可以通过,,, 没报错
函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
例如:
class A
{
A & operate = (const A &other); // 赋值函数(请问这里实现什么?)
};
A a, b, c; // a, b, c 为A 的对象
a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法(这两个赋值有什么问题?)[u][/u]
如果将赋值函数的返回值加const 修饰,那么该返回值的内容不允许被改动。上例中,语句 a = b = c 仍然正确,但是语句 (a = b) = c 则是非法的。
------解决方案--------------------
(a = b) = c 则是非法的。
是因为a=b是赋值,而后者,就是给const变量赋值了,违背定义了
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
这两个赋值有什么问题?
答案: 你试试,去了引用,那么会报错的, 没引用(a=b)=c,肯定出错。。
楼主试试
------解决方案--------------------
a = b = c相当于a = (b = c),b = c返回一个右值,把右值赋给a没有问题。但是(a = b) = c的话,a = b返回一个右值,赋值给右值是不合法的。
------解决方案--------------------
[Cpp.程序设计原理与实践].(机械工业出版社)有深刻的将这个问题,当初我看了豁然开朗,只是现在又忘记了。。。
另外,如果lz没看过这本书的话,建议看看,里面很多东东将的很精彩
------解决方案--------------------
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,是不可以的
------解决方案--------------------
class A
{
A & operate = (const A &other); // 赋值函数(请问这里实现什么?)
};
A a, b, c; // a, b, c 为A 的对象
a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法(这两个赋值有什么问题?)[u][/u]
你们用的什么编译器啊!上面的示例visual c++编译出现N个错误!operate是什么意思,说能解释一下程序吗?Thank you very much!新手求解
------解决方案--------------------
不知道大家怎么分析的;
根本没任何问题;
gcc 4.2表示代码没有问题;
返回值加const的话,(a = b) = c; 代码有问题是正常的,因为(a = b)返回的是一个const对象,用c来赋值有问题;
------解决方案--------------------
不是吧,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;
}
结果可以通过,,, 没报错