#include <iostream>
#include<conio.h>
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;
}
// method to display distance
void displayDistance() {
cout << "F: " << feet << " I:" << inches <<endl;
}
// overloaded minus (-) operator
Distance operator- () {
feet = -feet;
inches = -inches;
// return Distance(feet, inches);
}
};
int main() {
Distance D1(11, 10), D2(-5, 11);
-D1; // apply negation
D1.displayDistance(); // display D1
-D2; // apply negation
D2.displayDistance(); // display D2
return 0;
}
我是初学者,学习C ++重载运算符函数。这段代码实际上运行良好,但是第一步,我对// return Distance(feet, inches);
在程序中以注释的形式声明此语句并不感到困惑,但是输出仍然是正确的。但是,如果我运行程序时未对其进行注释,则该程序也可以正常运行,而不是该语句使用的目的是什么?第二,构造函数是否返回值?第三,它如何返回值我的意思是它不是变量我一直听说我们可以从变量返回值?
如果我在未注释的情况下运行程序,则该程序也可以正常运行,而该语句的用途是什么?
从构造函数,析构函数或具有cv void返回类型的函数的末尾流出就等于没有操作数的返回。否则,从main([basic.start.main])以外的函数的末尾流出会导致未定义的行为。
您的程序导致未定义的行为,任何事情都可能发生。
第二,构造函数是否返回值?
我认为您的意思是:
return Distance(feet, inches);
该行返回prvalue
,Distance
其中a是从feet
和构造的inches
。该值应该可以进行复制删除,并且可以保证从C ++ 17的复制中删除该值。
第三,它如何返回值我的意思是它不是变量我一直听说我们可以从变量返回值?
从上述的[stmt.return]中,重点是我的:
return语句的expr-or-braced-init-list称为其操作数。没有操作数的return语句只能在返回类型为cv void,构造函数([class.ctor])或析构函数([class.dtor])的函数中使用。操作数类型为void的return语句只能在返回类型为cv void的函数中使用。带有任何其他操作数的return语句只能在返回类型不是cv void的函数中使用;return语句通过操作数的复制初始化([dcl.init])初始化(显式或隐式)函数调用的glvalue结果或prvalue结果对象。[注意:如果return语句不是prvalue或其类型与函数的返回类型不同,则return语句可能涉及对构造函数的调用以执行操作数的复制或移动。如果返回了自动存储持续时间变量([class.copy]),则可以取消与return语句关联的复制操作或将其转换为move操作。—尾注] [示例:
std::pair<std::string,int> f(const char* p, int x) { return {p,x}; }
该return
语句应采用以下形式:
return; // for void and constructor, destructor
或者
return expression-or-braced-init-list;
无论如何,我认为您的减号运算符应如下所示:
Distance operator- () {
return Distance(-feet, -inches);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句