【C++】类和对象--初始化列表、友元、static成员、内部类
就会调用这个构造函数,给成员变量赋值。代码语言:javascriptAI代码解释如果没有定义无参的构造函数,我们建议将构造函数写成全缺省的,因为这样不管是有参对象还是无参对象都能够使用这个构造函数。我们来看一下如果不是全缺省的情况:代码语言:javascriptAI代码解释上面是通过构造函数进行初始化,除此之外,C++还提供了一种通过初始化列表的方式。初始化列表:以一个冒号开始 ,接着是一个以逗号
就会调用这个构造函数,给成员变量赋值。
代码语言: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:这里补充说明一下为什么自定义类型(无默认构造函数)必须在定义时初始化。先要注意的是,这里并不是说所有的自定义类型,而是特指那些没有默认构造函数的自定义类型,而默认的构造函数是无参构造函数。所以在没有无参构造函数的情况下,如果不提供初始化的参数(或者说是一个无参的对象),是肯定会报错的。
更多推荐


所有评论(0)