c++ - 需要帮助空运行,不知道输出是这样的

标签 c++

我很难空运行这段代码。我可以清楚地了解发生了什么,直到:

第 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;

步骤顺序是

  1. 评估 squareTemp - sq,它匹配 Square::operator-(Square sq1, Square sq2)
  2. squareTemp 复制构造参数 sq1 - 输出“第 7 行”
  3. sq 复制构造参数 sq2 - 输出“第 7 行”
  4. 输出“Line 7”(稍后我会解释)
  5. int-construct squareTemp in operator- - 输出“第 8 行”
  6. operator- 输出“第 6 行”
  7. 从`squareTemp 复制构造operator- 的返回值-输出“第 7 行”
  8. 现在我们有了 (squareTemp-sq) - sq 的第二部分,它是 Square::operator-(Square sq1, Square sq2)
    1. 返回值用作 sq1 - 理论上可以完成另一个拷贝,但编译器忽略了这一点。
    2. 这里第4步创建的对象是sq2
  9. (重复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/

相关文章:

c++ - mainwindow.o和***.o文件中的QT重复符号

c++ - 关于c++编程的两个问题

c++ - 跨越结构 vector 的成员

c++ - 这个循环一直给我段错误任何修复?

c++ - 处理键盘输入的回调

c++ - 编译 C++ 代码时出错(无效转换)

C++ 文件 (exe) 读取自身

c++ - 我可以使用 CArchive 在 MFC 中序列化 STL 映射吗?

javascript - 如何从 C++ 调用非参数化 QML 函数

c++ - 将 Box2D 与 SDL 中的现有游戏类结构集成?