C++从入门到精通——类的6个默认成员函数之构造函数

04-14 1044阅读

构造函数

  • 前言
  • 一、构造函数的概念
  • 二、构造函数特性

    前言

    类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。

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

    默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

    class Date {};
    

    C++从入门到精通——类的6个默认成员函数之构造函数


    一、构造函数的概念

    C++构造函数是一种特殊的成员函数,用于创建和初始化类的对象。它在对象被创建时自动调用,通常用于对对象的成员变量进行初始化操作。

    对于以下Date类:

    class Date
    {
    public:
    	void Init(int year, int month, int day)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    	void Print()
    	{
    		cout 
    	Date d1;
    	d1.Init(2022, 7, 5);
    	d1.Print();
    	Date d2;
    	d2.Init(2022, 7, 6);
    	d2.Print();
    	return 0;
    }
    
    public:
    	// 1.无参构造函数
    	Date()
    	{}
    	// 2.带参构造函数
    	Date(int year, int month, int day)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    void TestDate()
    {
    	Date d1; // 调用无参构造函数
    	Date d2(2015, 1, 1); // 调用带参的构造函数
    	// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
    	// 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象
    	// warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)
    	Date d3();
    }
    
    public:
    	/*
    	// 如果用户显式定义了构造函数,编译器将不再生成
    	Date(int year, int month, int day)
    	{
    	_year = year;
    	_month = month;
    	_day = day;
    	}
    	*/
    	void Print()
    	{
    		cout 
    	// 将Date类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函数
    		// 将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再生成
    		// 无参构造函数,放开后报错:error C2512: “Date”: 没有合适的默认构造函数可用
    		Date d1;
    	return 0;
    }
    
    public:
    	Time()
    	{
    		cout 
    private:
    	// 基本类型(内置类型)
    	int _year;
    	int _month;
    	int _day;
    	// 自定义类型
    	Time _t;
    };
    int main()
    {
    	Date d;
    	return 0;
    }
    
    public:
    	Time()
    	{
    		cout 
    private:
    	// 基本类型(内置类型)
    	int _year = 1970;
    	int _month = 1;
    	int _day = 1;
    	// 自定义类型
    	Time _t;
    };
    int main()
    {
    	Date d;
    	return 0;
    }
    
    public:
    	Date()
    	{
    		_year = 1900;
    		_month = 1;
    		_day = 1;
    	}
    	Date(int year = 1900, int month = 1, int day = 1)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    private:
    	int _year;
    	int _month;
    	int _day;
    };
    // 以下测试函数能通过编译吗?
    void Test()
    {
    	Date d1;
    }
    
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]