这个程序结果是什么?

img

是面向对象语言温秀梅版书的第三章最后一题,因为自己去编写得不出答案,希望在这里可以找到答案

你好,很高兴能回答你的问题。
首先我们先来看Tx类,他声明了三个方法——构造方法、析构方法和display方法。
其中:
构造方法需要用户传入两个参数,分别存入Tx类当中的i、j。有一点需要注意,我们来看你上传的图片当中的一行代码:

Tx::Tx(int i,int j=10)

这意味这在新建类对象时不一定要传入参数j,如果没传,则参数j默认为10
现在,我们顺便看一下main函数中的两行代码

Tx t1(22,11);
Tx t2(20);

由此可以看出此时:

t1.i = 22;  t1.j = 11;
t2.i = 20;  t2.j = 10;        //j值默认为十

接下来看看display方法,他的作用很简单,就是输出类当中的i,j
再看看析构方法,他会在析构前也输出i,j
好的,解决完函数内容,现在还有个棘手的问题:这里有两个类,t1和t2,他们那个会先被析构呢?
遇事不决,自己动手做实验先
于是我写了以下代码:

#include<iostream>

using namespace std;

class testClass
{
    public:
        testClass(int);                //构造函数
        ~testClass();                //析构函数
    private:
        int id;                        //用于查看是哪个类
};

testClass::testClass(int var_id)
{
    id = var_id;
    cout<<"Construct "<<id<<endl;                //输出id 
}

testClass::~testClass()
{
    cout<<"Destruct "<<id<<endl;                //输出id 
}

int main()
{
    testClass a(1);
    testClass b(2);
    testClass c(3);
    /*main函数结束后会自动析构*/
}

编译运行,输出:

Construct 1
Construct 2
Construct 3
Destruct 3
Destruct 2
Destruct 1

由此可以看出,后定义的类对象会先被析构
现在事情明了了,我们最后理一遍程序执行的顺序

  1. 定义对象t1、t2,且:t1.i = 22; t1.j = 11; t2.i = 20; t2.j = 10;
  2. 分别输出t1、t2的i、j
  3. 逐个析构t2、t1

由此可以推导出输出内容如下:

Constructing 22 11
Constructing 20 10
display:22 11
display:20 10
Destructing20 10
Destructing22 11

你可能会疑惑:输出内容当中的“Destructing”后面都不跟空格吗?至少我没在书中找到Destructing后面有空格
以上