需要帮助干运行,不知道输出是怎样的

时间:2014-04-17 00:21:03

标签: c++

我在运行此代码时遇到了困难。我可以清楚地了解到目前为止:

第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

1 个答案:

答案 0 :(得分:1)

您感到困惑的一句就是来自operator+

cout<<"Line 1"<<endl;
return squareTemp - sq - sq;

步骤顺序是

  1. 评估squareTemp - sq,其匹配Square::operator-(Square sq1, Square sq2)
  2. 来自sq1的copy-construct参数squareTemp - 输出&#34;第7行&#34;
  3. 来自sq2的copy-construct参数sq - 输出&#34;第7行&#34;
  4. 输出&#34;第7行&#34; (我稍后会解释一下)
  5. squareTemp中构建operator- - 输出&#34;第8行&#34;
  6. operator-输出&#34;第6行&#34;
  7. 从`squareTemp - 输出&#34;第7行&#34;
  8. 复制构造operator-的返回值
  9. 现在我们有(squareTemp-sq) - sq的第二部分Square::operator-(Square sq1, Square sq2)
    1. 返回值用作sq1 - 理论上可以完成另一个副本,但编译器忽略了这一点。
    2. 在步骤4中创建的对象是sq2此处
  10. (重复步骤5,6,7以输出&#34;第8行和第34行;&#34;第6行和第34行;&#34;第7行和第34行;
  11. 即使在步骤8之前没有使用步骤4,也允许在那里创建步骤4的原因是因为表达式中没有序列点:

    Square::operator-( Square::operator-(squareTemp, sq), sq )
    

    在调用内部squareTemp之前,编译器必须评估sq和第一个operator-。但是,在调用第二个sq之前,可以随时评估第二个operator-