提问人:JoeBass 提问时间:2/20/2017 最后编辑:JoeBass 更新时间:2/20/2017 访问量:8828
赋值运算符重载:返回 void 与返回引用参数 [duplicate]
Assignment operator overloading: returning void versus returning reference parameter [duplicate]
问:
我在网上看到的一些赋值重载运算符示例如下所示:
#include <iostream>
using namespace std;
class Distance {
private:
int feet; // 0 to infinite
int inches; // 0 to 12
public:
// required constructors
Distance(){
feet = 0;
inches = 0;
}
Distance(int f, int i){
feet = f;
inches = i;
}
void operator = (const Distance &D ) {
cout << "assigning..." << endl;
feet = D.feet;
inches = D.inches;
}
// method to display distance
void displayDistance() {
cout << "F: " << feet << " I:" << inches << endl;
}
};
int main() {
Distance D1(11, 10), D2(5, 11);
cout << "First Distance : ";
D1.displayDistance();
cout << "Second Distance :";
D2.displayDistance();
// use assignment operator
D1 = D2;
cout << "First Distance :";
D1.displayDistance();
return 0;
}
它们从重载函数返回 void。如果 D1 是被调用的对象,这对我来说是有意义的。
其他示例返回对类对象的引用。
#include <iostream>
using namespace std;
class Distance {
private:
int feet; // 0 to infinite
int inches; // 0 to 12
public:
// required constructors
Distance(){
feet = 0;
inches = 0;
}
Distance(int f, int i){
feet = f;
inches = i;
}
Distance& operator = (const Distance &D ) {
cout << "assigning..." << endl;
feet = D.feet;
inches = D.inches;
return *this;
}
// method to display distance
void displayDistance() {
cout << "F: " << feet << " I:" << inches << endl;
}
};
int main() {
Distance D1(11, 10), D2(5, 11);
cout << "First Distance : ";
D1.displayDistance();
cout << "Second Distance :";
D2.displayDistance();
// use assignment operator
D1 = D2;
cout << "First Distance :";
D1.displayDistance();
return 0;
}
这对我来说没有意义(考虑到第一个例子)。如果在第一个示例中调用类似 的东西,为什么第二个示例在这种情况下会起作用?是不是有点像?归根结底,这有什么不同吗?D1 = D2;
D1.=(D2);
D1 = D1.=(D2);
答:
5赞
songyuanyao
2/20/2017
#1
按照惯例,赋值运算符通常返回引用 (to );这样就可以链接赋值,就像这些内置类型的行为一样。例如*this
Distance D1, D2, D3;
D1 = D2 = D3;
对于 ,它等价于 。对于第二种情况,它不会改变,返回的值只是被丢弃。对于 ,它等价于 。请注意,返回的值(即对 的引用)用作 上调用的赋值运算符的参数。D1 = D2;
D1.operator=(D2);
D1 = D2 = D3;
D1.operator=(D2.operator=(D3));
D2
D1
评论
1赞
M.M
2/20/2017
您也可以将其用作子表达式,例如 ,或 ,尽管某些风格指南不鼓励这样做。while (D1 = D2)
(D1 = D2).foo()
15赞
Sergey Kalinichenko
2/20/2017
#2
尽管 C++ 语言允许您使用任何返回类型重载赋值运算符,包括 ,但应强烈考虑遵循从运算符返回对被分配者的引用的广泛约定。void
其基本原理是
A = B;
无论作业返回什么,都会起作用,而
A = B = C;
这是一个完美的赋值链将中断,除非返回与赋值兼容的东西(通常是与 相同类型的对象)。B = C
A
A
另一个问题是,例如,必须将对象作为较大表达式的一部分进行比较
mytype obj;
while ((obj = read_obj(cin)) != END_OBJ) {
...
}
因此,返回的最大缺点是无法链接分配并在不允许的地方使用它们。void
void
评论