注册 登录
编程论坛 C++教室

符号重载的问题

xieyuanchang 发布于 2007-08-07 21:08, 1361 次点击
A & operate = (const A &other);与
A operate = (const A &other);
有什么区别?
10 回复
#2
maoguoqing2007-08-07 21:42
一个返回的是对象引用,一个返回对象的拷贝
#3
aipb20072007-08-07 22:07
A& 引用返回,返回值本身;
A 返回值副本,有个复制构造函数调用过程;

其次引用返回的是一个左值。
#4
maoguoqing2007-08-07 22:10
以下是引用aipb2007在2007-8-7 22:07:15的发言:
A& 引用返回,返回值本身;
A 返回值副本,有个复制构造函数调用过程;

其次引用返回的是一个左值。

what this sentence mean?
why can't me input chiese word?

#5
aipb20072007-08-07 22:23
以下是引用maoguoqing在2007-8-7 22:10:57的发言:

what this sentence mean?
why can't me input chiese word?

比如,重载下标操作符
A& operator[](int i);

引用返回的话,可以直接修改A的值,比如B[1] = ..

如果非引用返回的话,就不行了。

#6
maoguoqing2007-08-07 22:39

嗯,这样说我就明白了,不过在重载付值操作的时候这样做只是为了和标准的类型一至,可以用连等号。

#7
aipb20072007-08-07 22:42
其实赋值操作符,我觉得用引用返回或者非引用返回都差不多。
因为=运算是右结合的,所以用连等号与这个&似乎关系不大。

不知道我理解对不,只是习惯上在=时都用上了&.
#8
maoguoqing2007-08-07 22:51

本来是可以的,但是最好返回引用

1。效率,返回非引用会调用一次构造函数
2。与标准类型一致,如
int i,j=1,k=2;
(i=j)=k;//这样就改变了操作的先后,i=j如果不返回i的引用,那么k的值就无法付给i了


#9
xieyuanchang2007-08-08 03:35

谢谢你们的讨论我认真看了下,并对此希望再给上我的理解
与ls说的首先是效率,由于符号重载一般返回的都是对象和对象指针,都不是简单变量.
引用调用可以提高效率,避免调用构造函数.

但是我想问下,怎么值的返回为什么不能成为左值?

补充:不过引用返回的都很容易犯个错误,就是返回栈的变量,由于函数自动释放形参,若返回的是返回栈的变量都将出错

在问下楼上的,再解释下第二点2。与标准类型一致,

#10
aipb20072007-08-08 09:58
to xieyuanchang:

其实返回是引用还是非引用,主要不是由效率确定,是由第2点,你是想你的返回值能被操作(左值),还是直接一个值而已。不过也有第3种办法,那就是返回常量引用 const type&这样就都考虑了,你仔细想一下就会发现这跟参数传递是一样的。这些都得灵活运用。
你补充的那点相当好,如你所说,不能返回局部变量的引用,同样的道理,不能返回指向局部变量的指针。因为这样的对象生命周期不在函数外。

他说的与标准类型一致,是指这个操作在标准类型上提供了怎样的形式,我们重再的时候就要按这个走。
int i,j=1,k=2;
(i=j)=k;//这样就改变了操作的先后,i=j如果不返回i的引用,那么k的值就无法付给i了
比如你重载=,就要能向上面那样用。
#11
xieyuanchang2007-08-08 11:21

我明白了,谢谢

1