operator + 应该返回const T& 还是 T& ?

lingol 2008-07-31 01:12:39
《D&E》里面说要返回const T&, 为了防止 (a=b)=c;
《Exceptional C++》说要返回 T&,为了与STL的容器兼容。
两个好像都有理……
...全文
576 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingol 2008-08-01
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 Maxwell 的回复:]
我搬gcc是因为我没有VS08。
你的代码问题在于operator int();
那么讨论能不能返回T&不如先讨论一下要不要定义类型转换操作符。
[/Quote]
[Quote=引用 25 楼 lingol 的回复:]
VS2008 有个P警告,只是如果类型T不能隐式转换为bool的话编译不过罢了。
[/Quote]

前面已经说得很清楚了,这里仅仅为了演示。
你总不能排除某个类需要转换为int,又要重载operator = 吧?
lingol 2008-08-01
  • 打赏
  • 举报
回复
弊,看漏了,是"const Complex" ,楼上的可以删了。(这里怎么不让人删自己的帖子?)
41楼,对不起对不起。
lingol 2008-08-01
  • 打赏
  • 举报
回复
41楼,怎么解释这个?貌似和你的“无论如何,双目运算符都不要返回带&的东东,而且要const
不怎么和谐啊,嘿嘿
http://www.gotw.ca/gotw/004.htm
4. ERROR: operator+ should not modify this object's value. It should return a temporary object containing the sum. Note that this return type should be "const Complex" (not just "Complex") in order to prevent usage like "a+b=c".


另外,本人看不惯说话未经大脑者、信口开河者、不懂装懂者、教条主义者,这些人的回复无益于
技术讨论。我看不惯就批,不行么?
guolihui112 2008-08-01
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 fallening 的回复:]
C/C++ code//无论如何,双目运算符都不要返回带&的东东,而且要constfriendconstToperator+(constT&lhs,constT&rhs );//单目运算符尽量返回带&的东东,只有后置自增自减这两个运算符按照双目处理T&operator=(constT&other );
以上

[/Quote]
这是潜规则,要遵从

另外,如果注重效率、临时对象等问题,尽量用其他一些技术实现,如模板元编程、表达式延迟计算等
晨星 2008-08-01
  • 打赏
  • 举报
回复
对于操作符重载,惯例是:内置类型怎么做,咱就怎么做。
当然,理由充分,惯例也是可以打破的。
不过大多数时候懒得去多想,遵照惯例就OK了。
如此而已。
Kenny_Glacier 2008-08-01
  • 打赏
  • 举报
回复
LZ的态度有问题,好像这里的人都欠你钱似的
fallening 2008-08-01
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 lingol 的回复:]
很感谢31楼不辞劳苦写了这么完整的示例。不过只怕误解了我的意思,
我说“授之以渔”,不是想请教如何,而是为何。
从32楼的代码中看不出为何无论如何,双目运算符都不要返回带&的东东,而且要const
可能本人悟性不够,看不出来,还请fallening再讲解一下
[/Quote]
前人之叙备矣
http://www.google.com/search?hl=en&q=GotW+Class+Mechanics&btnG=Google+Search

Maxwell 2008-08-01
  • 打赏
  • 举报
回复
我倒是总结过,可你不信也没办法。

返回T&是为了与内置类型保持一样的语法语义,如果你有理由不用这种特性(比如你定义了类型转换操作符,又怕出错),那返回const T&也没关系。

Maxwell 2008-08-01
  • 打赏
  • 举报
回复
我搬gcc是因为我没有VS08。
你的代码问题在于operator int();
那么讨论能不能返回T&不如先讨论一下要不要定义类型转换操作符。
lingol 2008-08-01
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 tangyulong1214 的回复:]
我认为是T,因为如果返回CONST ,那么则意味着不能进行连续运算!

当然得看那种情况更合适你的应用...
[/Quote]
又来了一个南郭……结了吧结了吧
ketet 2008-08-01
  • 打赏
  • 举报
回复
返回的类型和你的需求有关系,当然对于语法来说,都是正确的,所以没有对错之分,明白吗?
tangyulong1214 2008-08-01
  • 打赏
  • 举报
回复
我认为是T,因为如果返回CONST ,那么则意味着不能进行连续运算!

当然得看那种情况更合适你的应用...
lingol 2008-08-01
  • 打赏
  • 举报
回复
那些说“视情况而定”、“根据需要”之类各打五十大板的仁兄们,麻烦总结一下什么
“情况”下用const T&,什么“需要”下用 T&,否则等于什么都没说。
晨星 2008-08-01
  • 打赏
  • 举报
回复
楼上说的是有道理的,应该明白原理,然后自行决定。
另外,重载类型转换操作符确实应该慎用,因为容易造成一些令人头痛的问题,就连可以起隐式转换作用的单参构造函数都应该声明为explicit。
STL里的string,没有重载operator const char*,而是提供了一个成员函数c_str(),就是基于这种考虑。
lingol 2008-08-01
  • 打赏
  • 举报
回复
很感谢31楼不辞劳苦写了这么完整的示例。不过只怕误解了我的意思,
我说“授之以渔”,不是想请教如何,而是为何
从32楼的代码中看不出为何无论如何,双目运算符都不要返回带&的东东,而且要const
可能本人悟性不够,看不出来,还请fallening再讲解一下
Maxwell 2008-08-01
  • 打赏
  • 举报
回复
你当时说更真实的例子,我以为你是编译通过的,因此给你贴个错误。

就像=有返回T&和const T&两种一样,转换为int也有多种方式,比如AsInt(),可能更被推荐使用。
你说的风险是由两个原因共同作用造成的,因此不能说非要这个问题上坚持错的,把责任都怪到另一种头上。

每个人都要根据自己的情况来选择,如果周围环境不好,不如追求安全,就定义const T&,标准扔在一边,如果是我自己写代码全部是由我控制,我选择用T&与内置类型保持一致。所以告诉你什么情况下用那种就太教条了,不如你明白各有什么优缺点,自己选择。
herman~~ 2008-07-31
  • 打赏
  • 举报
回复
operator+ 返回引用,至于是否常量,个人觉得不一定,看情况而定

毕竟重载操作符+的对象用途是不定的
lingol 2008-07-31
  • 打赏
  • 举报
回复
P也没警告一个……
lingol 2008-07-31
  • 打赏
  • 举报
回复
楼上的等下再拜读,27楼,你搬gcc出来唬人么:
lingol@Lion:~/cpp$ cat test.cpp

#include <iostream>
using namespace std;

class A
{
public:
A(int i = 0) : num(i) {};
A& operator = (const A& source)
{
this->num = source.num;
return(*this);
}
operator int()
{
return num;
}
private:
int num;
};

int main()
{
A i, j(1), k(2);
if ((j=k) = i)
std::cout<<"OK"<<std::endl;
return(0);
}

lingol@Lion:~/cpp$ g++ -o test test.cpp
fallening 2008-07-31
  • 打赏
  • 举报
回复
貌似楼上源代码复制的时候又多点了一下,重新贴了
#include <iostream>
using namespace std;

class A
{
public:
A():data_(0){}

~A(){}

template< class T>
A( const T& other )
{
operator = (other );
}

template< class T>
A& operator = ( const T& other )
{
copy( other );
return *this;
}

A& operator +=( const A& other )
{
data_ += other.data_;
return *this;
}

operator bool()
{
return data_ ? true : false;
}

friend const A operator +( const A& lhs, const A& rhs )
{
A tmp( lhs );
tmp += rhs;
return tmp;
}

//attention, return a reference
friend ostream& operator << ( ostream& os, const A& rhs )
{
return rhs.print( os );
}

private:
int data_;

void copy( const A& other )
{
data_ = other.data_;
}

void copy( const int& other )
{
data_ = other;
}

ostream& print( ostream& os ) const
{
return os << data_;
}

};

int main()
{
A s;
A t;

s = 5;
t = 10;
cout << s << endl;

s = s + t;
cout << s << endl;

s += t;
cout << s << endl;

s += 7;
cout << s << endl;

if ( t = ( s = 18 ) = 19 )
cout << t << endl;


return 0;
}







加载更多回复(31)

64,648

社区成员

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

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