鱼C论坛

 找回密码
 立即注册
查看: 735|回复: 2

[已解决]构造函数和析构函数的调用

[复制链接]
发表于 2020-11-13 01:06:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<iostream>
using namespace std;
class Ctyre           //轮胎类

{
private:
    int radius;       //半径
    int width;         // 宽度

public:
    Ctyre() :radius(16), width(185)
    {
        cout << radius << "\tCtyre  构造函数" << endl;

    }
    Ctyre(int r, int w) :radius(r), width(w)
    {
        cout << radius << " \t Ctyre  构造函数 " << endl;

    }

    ~Ctyre()
    {
        cout << radius << "\tCtyre  析构函数" << endl;

    }
    int getRadius()

    {
        return radius;

    }
    int getWidth()
    {
        return width;

    }
};

class Ccar       //汽车类

{
private:
    int price; // 价格

    Ctyre tyre;

public:
    Ccar();

    Ccar(int p, int tr, int tw);

    ~Ccar();
    int getPrice()
    {
        return price;
    }

    Ctyre getCtyre()
    {
        return tyre;
    }


};
Ccar::Ccar()
{
    price = 50010; Ctyre(); cout <<price << " \t Ccar 构造函数" << endl;
}
Ccar::Ccar(int p, int tr, int tw) : price(p), tyre(tr, tw)
{
    cout << price << " \tCcar 构造函数 " << endl;



}

Ccar::~Ccar()
{
   cout << price << "\tCcar  析构函数" << endl;


}

int main()
{
    Ccar car(48900, 17, 225);

    cout << " price =" << car.getPrice();
    cout << "\t Ctyre .radius = " << car.getCtyre().getRadius()
        << " \tCtyre .width = " << car.getCtyre().getWidth() << endl;

    Ccar car1;
    cout << " price =" << car1.getPrice();
    cout << "\t Ctyre .radius = " << car1.getCtyre().getRadius()
        << " \tCtyre .width = " << car1.getCtyre().getWidth() << endl;
运行结果:
17       Ctyre  构造函数
48900   Ccar 构造函数
price =48900    Ctyre .radius = 17     Ctyre .width = 225
17      Ctyre  析构函数
17      Ctyre  析构函数
16      Ctyre  构造函数
16      Ctyre  构造函数
16      Ctyre  析构函数
50010    Ccar 构造函数
price =50010    Ctyre .radius = 16     Ctyre .width = 185
16      Ctyre  析构函数
16      Ctyre  析构函数
50010   Ccar  析构函数
16      Ctyre  析构函数
48900   Ccar  析构函数
17      Ctyre  析构函数

为什么会调用这么多次析构和构造函数:
17     Ctyre  析构函数
17      Ctyre  析构函数
16      Ctyre  构造函数
16      Ctyre  构造函数
16      Ctyre  析构函数
50010    Ccar 构造函数


116      Ctyre  析构函数
16      Ctyre  析构函数

为什么会出现这几行代码???、
最佳答案
2020-11-13 08:40:43
本帖最后由 xieglt 于 2020-11-13 08:55 编辑

解释在注释里头
#include<iostream>
using namespace std;
class Ctyre           //轮胎类

{
private:
    int radius;       //半径
    int width;         // 宽度
        
public:
    Ctyre() :radius(16), width(185)
    {
        cout << radius << "\tCtyre  构造函数" << endl;
                
    }
    Ctyre(int r, int w) :radius(r), width(w)
    {
        cout << radius << " \t Ctyre  构造函数 " << endl;
                
    }
        
    ~Ctyre()
    {
        cout << radius << "\tCtyre  析构函数" << endl;
                
    }
    int getRadius()
                
    {
        return radius;
                
    }
    int getWidth()
    {
        return width;
                
    }
};

class Ccar       //汽车类

{
private:
    int price; // 价格
        
    Ctyre tyre;
        
public:
    Ccar();
        
    Ccar(int p, int tr, int tw);
        
    ~Ccar();
    int getPrice()
    {
        return price;
    }
        
        //这里应该写成 Ctyre & getCtyre() 返回引用,即返回成员变量的地址
        //否则,编译器将在栈上构造一个临时的 Ctyre 对象
    Ctyre getCtyre()
    {
        return tyre;
    }
        
        
};
Ccar::Ccar()
{
        //这里调用 ctyre 会构造一个对象,另外还会构造一个成员变量 tyre 这里是构造 2 个
    price = 50010; Ctyre(); cout <<price << " \t Ccar 构造函数" << endl;
}
Ccar::Ccar(int p, int tr, int tw) : price(p), tyre(tr, tw)
{
    cout << price << " \tCcar 构造函数 " << endl;
        
        
        
}

Ccar::~Ccar()
{
        cout << price << "\tCcar  析构函数" << endl;
}

int main()
{
        //这里构造了一个 Ctyre 对象  +1
    Ccar car(48900, 17, 225);
        
    cout << " price =" << car.getPrice();
        //这里构造了 2个临时 Ctyre 对象 + 2 ,
        //这两个临时对象走的是 拷贝构造函数 或者 = 重载函数 ,你没有定义,编译器自己帮你定义了
        //Ctyre(const Ctyre &)
        //Ctyre & operator = (const Ctyre &)
    cout << "\t Ctyre .radius = " << car.getCtyre().getRadius()
        << " \tCtyre .width = " << car.getCtyre().getWidth() << endl;
        
        //这里构造了 2个 Ctyre 对象 +2
    Ccar car1;
    cout << " price =" << car1.getPrice();
        //这里构造了2个临时 Ctyre 对象 +2
        //这两个临时对象走的是 拷贝构造函数 或者 = 重载函数
    cout << "\t Ctyre .radius = " << car1.getCtyre().getRadius()
        << " \tCtyre .width = " << car1.getCtyre().getWidth() << endl;
        
        //总共是 7 个 Ctyre 对象,你数一数析构输出看对不对
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-13 08:40:43 | 显示全部楼层    本楼为最佳答案   
本帖最后由 xieglt 于 2020-11-13 08:55 编辑

解释在注释里头
#include<iostream>
using namespace std;
class Ctyre           //轮胎类

{
private:
    int radius;       //半径
    int width;         // 宽度
        
public:
    Ctyre() :radius(16), width(185)
    {
        cout << radius << "\tCtyre  构造函数" << endl;
                
    }
    Ctyre(int r, int w) :radius(r), width(w)
    {
        cout << radius << " \t Ctyre  构造函数 " << endl;
                
    }
        
    ~Ctyre()
    {
        cout << radius << "\tCtyre  析构函数" << endl;
                
    }
    int getRadius()
                
    {
        return radius;
                
    }
    int getWidth()
    {
        return width;
                
    }
};

class Ccar       //汽车类

{
private:
    int price; // 价格
        
    Ctyre tyre;
        
public:
    Ccar();
        
    Ccar(int p, int tr, int tw);
        
    ~Ccar();
    int getPrice()
    {
        return price;
    }
        
        //这里应该写成 Ctyre & getCtyre() 返回引用,即返回成员变量的地址
        //否则,编译器将在栈上构造一个临时的 Ctyre 对象
    Ctyre getCtyre()
    {
        return tyre;
    }
        
        
};
Ccar::Ccar()
{
        //这里调用 ctyre 会构造一个对象,另外还会构造一个成员变量 tyre 这里是构造 2 个
    price = 50010; Ctyre(); cout <<price << " \t Ccar 构造函数" << endl;
}
Ccar::Ccar(int p, int tr, int tw) : price(p), tyre(tr, tw)
{
    cout << price << " \tCcar 构造函数 " << endl;
        
        
        
}

Ccar::~Ccar()
{
        cout << price << "\tCcar  析构函数" << endl;
}

int main()
{
        //这里构造了一个 Ctyre 对象  +1
    Ccar car(48900, 17, 225);
        
    cout << " price =" << car.getPrice();
        //这里构造了 2个临时 Ctyre 对象 + 2 ,
        //这两个临时对象走的是 拷贝构造函数 或者 = 重载函数 ,你没有定义,编译器自己帮你定义了
        //Ctyre(const Ctyre &)
        //Ctyre & operator = (const Ctyre &)
    cout << "\t Ctyre .radius = " << car.getCtyre().getRadius()
        << " \tCtyre .width = " << car.getCtyre().getWidth() << endl;
        
        //这里构造了 2个 Ctyre 对象 +2
    Ccar car1;
    cout << " price =" << car1.getPrice();
        //这里构造了2个临时 Ctyre 对象 +2
        //这两个临时对象走的是 拷贝构造函数 或者 = 重载函数
    cout << "\t Ctyre .radius = " << car1.getCtyre().getRadius()
        << " \tCtyre .width = " << car1.getCtyre().getWidth() << endl;
        
        //总共是 7 个 Ctyre 对象,你数一数析构输出看对不对
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-13 15:54:56 | 显示全部楼层
嗯,晓得了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 16:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表