gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:56:25 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com