【C++的奇妙冒险】构造函数和析构函数(初始化和清理)

慈云数据 2024-05-30 技术支持 52 0

文章目录

  • 前言
  • 一、默认成员函数
  • 二、构造函数
    • 构造函数的概念
    • 构造函数的特性
    • 默认构造函数
    • 三、析构函数
      • 析构函数的概念
      • 析构函数的特性
      • 析构函数的先后析构问题
      • 为什么要有析构函数?
      • 析构函数的特性检验

        前言

        一、默认成员函数

        如果一个类中什么成员都没有,简称为空类。

        class Date 
        {};
        

        空类中真的什么都没有吗?nonono~,并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。

        在这里插入图片描述

        如上图所示,类共有6个默认成员函数,咱们逐一攻破,先Follow me拿下前两个 构造函数和析构函数,小细节很多哦~瞪大眼睛嗷👀。

        首先,对于默认成员函数,如果我们不写,编译器是会自己生成一份滴。(谁家的编译器这么良心 ❤️!)

        这里有老铁就要问了,哎哥们儿~哥们儿,那它们都有啥作用啊?哼哼哼,不妨告诉你嗷,它们可有用了,就比如:栈(Stack)哥们儿是不是要自己写个初始化函数(Init)和销毁函数(Destroy),有些粗心的老铁就非常容易忘记,要么忘了写初始,上来就push,要么最后忘了销毁,导致内存泄漏,对于初始化和清理,构造函数和析构函数就可以帮助我们完成,是的构造函数就像Init,析构函数就像Destroy。下面话不多说,先从构造函数下手。👻

        二、构造函数

        先看一个普通的日期

        class Date
        {
        public:
        	void GetDate(int year, int month, int day)
        	{
        		_year = year;
        		_month = month;
        		_day = day;
        	}
        	void Print()
        	{
        		cout 
        	Date d1;
        	d1.GetDate(2024, 5, 19);
        	d1.Print();
        	Date d2;
        	d2.GetDate(2024, 5, 20);
        	d2.Print();
        	return 0;
        }
        
        public:
                //无参的构造函数
                Date()
                {
                       _year = 0;
                       _month = 1;
                       _day = 2;
                }
                //带参的构造函数
                Date(int year, int month, int day)
                {
                       _year = year;
                       _month = month;
                       _day = day;
                }
                void Print()
                {
                       cout 
                //Date d1()//错的
                Date d1;//对象实例化,此时触发构造,调用无参构造
                d1.Print();
                Date d2(2024, 5, 17);//对象实例化,此时触发构造,调用带参构造函数
                d2.Print();
                return 0;
        }
        
        public:
        	Date(int year = 1, int month = 1, int day = 1)
            {
                _year = year;
                _month = month;
                _day = day;
            }
            void Print()
            {
                cout 
        	Date d1;
        	d1.Date();
            return 0;
        }
        
        public:
        	Date(int year = 1, int month = 1, int day = 1)
            {
                _year = year;
                _month = month;
                _day = day;
            }
            void Print()
            {
                cout 
        	Date d1();//错啦!调用无参要把后面的括号去掉 Date d1;像这样
        	Date d2(2024, 5, 19);
        	d1.Print();
        	d2.Print();
            return 0;
        }
        
        public:
                void Print()
                {
                       cout 
                Date d1;//无参数
                d1.Print();
                return 0;
        }
        
        public:
        	Date(int year = 1, int month = 1, int day = 1)
        	{
        		_year = year;
        		_month = month;
        		_day = day;
        	}
        	void Print()
        	{
        		cout 
        	Date d1;
        	Date d2(2024);
        	Date d3(2024, 5);
        	Date d4(2024, 5, 20);
        	d1.Print();
        	d2.Print();
        	d3.Print();
        	d4.Print();
        	return 0;
        }
        
        public:
        //我可没写构造函数昂
                void Print()
                {
                       cout 
                Date d1;//无参数
                d1.Print();
                return 0;
        }
        
        public:
            Time()
            {
                cout 
        private:
            // 基本类型(内置类型)
            int _year;
            int _month;
            int _day;
            // 自定义类型
            Time _t;
        };
        int main()
        {
            Date d;
            return 0;
        }
        
        public:
        	// 默认构造函数(不用参数就可以调的)
        	A() 
        	{
        		cout 
        public:
        	//空~
        private:
        	int _year;
        	int _month;
        	int _day;
        	A _aa;   // 对自定义类型处理,此时会调用默认构造函数 A() {...}
        };
        int main(void)
        {
        	Date d1;
        	return 0;
        }
        
        public:
        	// 如果没有默认的构造函数,会报错。
        	A(int a) //故意写的 带参
        	{    
        		cout 
        public:
        private:
        	// 如果没有默认构造函数就会报错
        	int _year;
        	int _month;
        	int _day;
        	A _aa;
        };
        int main(void)
        {
        	Date d1;
        	return 0;
        }
        
        public:
        private:
        	int _a;
        };
        class Date
        {
        public:
        private:
        	int _year;
        	int _month;
        	int _day;
        	A _aa;
        };
        int main(void)
        {
        	Date d1;
        	return 0;
        }
        
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon