我在运行此代码时遇到了困难。我可以清楚地了解到目前为止:
第8行
第8行
第9行
第7行
第8行
第1行
但在这之后事情变得混乱。有人可以解释一下吗?上面的三条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行
***如果这是输出的最后一行,那么它就是错误的结果
一边:11
第5行
面积:144
s.side
s.side
***如果这是输出的最后一行,那么它就是错误的结果
12
答案 0 :(得分:1)
您感到困惑的一句就是来自operator+
。
cout<<"Line 1"<<endl;
return squareTemp - sq - sq;
步骤顺序是
squareTemp - sq
,其匹配Square::operator-(Square sq1, Square sq2)
sq1
的copy-construct参数squareTemp
- 输出&#34;第7行&#34; sq2
的copy-construct参数sq
- 输出&#34;第7行&#34; squareTemp
中构建operator-
- 输出&#34;第8行&#34; operator-
输出&#34;第6行&#34; operator-
的返回值
(squareTemp-sq) - sq
的第二部分Square::operator-(Square sq1, Square sq2)
sq1
- 理论上可以完成另一个副本,但编译器忽略了这一点。sq2
此处即使在步骤8之前没有使用步骤4,也允许在那里创建步骤4的原因是因为表达式中没有序列点:
Square::operator-( Square::operator-(squareTemp, sq), sq )
在调用内部squareTemp
之前,编译器必须评估sq
和第一个operator-
。但是,在调用第二个sq
之前,可以随时评估第二个operator-
。