我很难空运行这段代码。我可以清楚地了解发生了什么,直到:
第 8 行
第 8 行
第 9 行
第 7 行
第 8 行
第 1 行
但是在这之后事情就变得困惑了。有人可以解释一下吗?上面后面怎么还有三个Line 7?不应该有两个吗?
抱歉,它有点长,但我不知道我是怎么弄错的。
代码:
#include <iostream>
using namespace std;
class Square {
friend Square operator -(Square sq1, Square sq2);
friend ostream& operator<<(ostream& out, Square & s);
private:
int side;
public:
Square(int);
Square(Square &);
Square operator+(Square);
Square operator/(Square);
Square operator ++(int);
Square operator--();
int getSide();
int getArea();
};
Square::Square(int _side){
cout<<"Line 8"<<endl;
side = _side;
}
Square::Square(Square & s){
cout<<"Line 7"<<endl;
side = s.side;
}
Square Square :: operator +(Square sq){
Square squareTemp(0);
squareTemp.side = side + sq.side/sq.side - 1;
cout<<"Line 1"<<endl;
return squareTemp-sq-sq;
}
Square Square :: operator /(Square sq){
Square squareTemp(0);
squareTemp.side = side - 1;
cout<<"Line 2"<<endl;
return --squareTemp;
}
Square Square :: operator ++(int i){
Square squareTemp(0);
squareTemp.side = side + 2;
cout<<"Line 3"<<endl;
return squareTemp;
}
Square Square :: operator --(){
Square squareTemp(0);
squareTemp.side = (squareTemp.side++) +side + 1;
cout<<"Line 4"<<endl;
return squareTemp;
}
int Square :: getSide(){
cout<<"***If this is the last line of output then it is Wrong Result"<<endl;
return side;
}
int Square :: getArea(){
cout<<"Line 5"<<endl;
side++;
return side * side;
cout<<"Line 21"<<endl;
}
Square operator-(Square sq1, Square sq2){
Square squareTemp(0);
squareTemp.side = sq1.side + sq2.side;
cout<<"Line 6"<<endl;
return squareTemp;
}
ostream&operator<<(ostream& out, Square & s){
out<<"s.side"<<endl;
return out;
}
int main(){
Square s1(3);
Square s2(4);
cout<<"Line 9"<<endl;
Square s = s1 + s2;
cout<<"Side of s:"<<s.getSide() <<endl;
cout<<"Area of s:"<<s.getArea() <<endl;
cout<<s1<<endl;
cout<<s2<<endl;
cout<<s.getSide()<<endl;
system("PAUSE");
}
输出:
第 8 行
第 8 行
第 9 行
第 7 行
第 8 行
第 1 行
第 7 行
第 7 行
第 7 行
第 8 行
第 6 行
第 7 行
第 8 行
第 6 行
第 7 行
***如果这是最后一行输出那么它是错误的结果
s:11 的一侧
第 5 行
s的面积:144
s.side
s.side
***如果这是最后一行输出那么它是错误的结果
12
最佳答案
您感到困惑的那一行来自 operator+
。
cout<<"Line 1"<<endl;
return squareTemp - sq - sq;
步骤顺序是
- 评估
squareTemp - sq
,它匹配Square::operator-(Square sq1, Square sq2)
- 从
squareTemp
复制构造参数sq1
- 输出“第 7 行” - 从
sq
复制构造参数sq2
- 输出“第 7 行” - 输出“Line 7”(稍后我会解释)
- int-construct
squareTemp
inoperator-
- 输出“第 8 行” operator-
输出“第 6 行”- 从`squareTemp 复制构造
operator-
的返回值-输出“第 7 行” - 现在我们有了
(squareTemp-sq) - sq
的第二部分,它是Square::operator-(Square sq1, Square sq2)
- 返回值用作
sq1
- 理论上可以完成另一个拷贝,但编译器忽略了这一点。 - 这里第4步创建的对象是
sq2
- 返回值用作
- (重复5、6、7步,输出"Line 8""Line 6""Line 7"
尽管直到第 8 步才使用第 4 步,但允许在那里创建第 4 步的原因是因为表达式中没有序列点:
Square::operator-( Square::operator-(squareTemp, sq), sq )
编译器必须在调用内部 operator-
之前评估 squareTemp
和第一个 sq
。但是,在调用第二个 operator-
之前的任何时候都可以自由计算第二个 sq
。
关于c++ - 需要帮助空运行,不知道输出是这样的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23122488/