就会调用这个构造函数,给成员变量赋值。

代码语言:javascript

AI代码解释

class Date
{
public:
	Date(int year = 1 , int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	//声明
	int _year;
	int _month;
	int _day;
};
 
int main()
{
	//对象
	Date d1(2025, 8, 23);
	Date d2;//未定义无参的默认构造  写成全缺省就ok
	return 0;
}

如果没有定义无参的构造函数,我们建议将构造函数写成全缺省的,因为这样不管是有参对象还是无参对象都能够使用这个构造函数

我们来看一下如果不是全缺省的情况:

代码语言:javascript

AI代码解释

class Date
{
public:
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;

};

int main() {
	Date d1(2025,8,23);
    //对于下面这个无参的对象,无法调用构造函数
    //因为我们只有含参的构造函数
	Date d2;
}

上面是通过构造函数进行初始化,除此之外,C++还提供了一种通过初始化列表的方式。


1.2. 初始化列表

初始化列表:以一个冒号开始 ,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

我们试着使用初始化列表的形式,初始化我们的Date日期类:

代码语言:javascript

AI代码解释

class Date
{
public:
 
	//初始化列表
	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{	
	}
 
private:
	//声明
	int _year;
	int _month;
	int _day;
};
 
int main()
{
	//对象
	Date d1(2025, 8, 23);
	Date d2;
	return 0;
}

1.2.1. 初始化列表的价值

从上面的代码来看,好像和使用构造函数体赋值并没有优化什么,那么为什么还要使用初始化列表呢?

这里我们就要回忆起一个知识点,有些成员变量是需要在声明时就进行初始化的!!!

因为如果需要在变量声明时就初始化的话,构造函数体赋值的方式,明显是会报错的。因为在没有调用构造函数之前,都无法进行初始化。而初始化列表就能完美解决这个问题!

Q:思考,那些成员是必须在定义的地方就进行初始化呢?A:(a) 引用成员变量 (b)const成员变量 (c)自定义类型(无默认构造函数)PS:这里补充说明一下为什么自定义类型(无默认构造函数)必须在定义时初始化。先要注意的是,这里并不是说所有的自定义类型,而是特指那些没有默认构造函数的自定义类型,而默认的构造函数是无参构造函数。所以在没有无参构造函数的情况下,如果不提供初始化的参数(或者说是一个无参的对象),是肯定会报错的。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐