再次理解构造函数
在《类与对象–中》这篇里,我们谈到了构造函数的一些基础特性。通俗说构造函数就是用来自动的给对象赋初始值。这次我们再来了解一下构造函数的其他特性
特性
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。但是这里要注意构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值
初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式
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 A(2022, 10, 13);
return 0;
}

可以看到对象很好地被赋予了初始值。那么我们为什么要使用初始化列呢,之前学的那种构造函数也可以给对象赋值
因为在类中有个别的成员必须要在初始化列表位置进行初始化
- const成员变量
- 自定义类型成员(且该类没有默认构造函数)
- 引用成员变量
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cU9oPniU-1665673202632)(C:\Users\黄\AppData\Roaming\Typora\typora-user-images\image-20221013212411394.png)]](https://i-blog.csdnimg.cn/blog_migrate/12a8d6ea707f306d301bfc9399eb66a1.png)
像这种情况可以看到,const修饰的变量_a并不能被赋初值,但是如果我是用初始化列表呢
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w68PBJz9-1665673202635)(C:\Users\黄\AppData\Roaming\Typora\typora-user-images\image-20221013212540920.png)]](https://i-blog.csdnimg.cn/blog_migrate/25f252936cfa872170b65af0520a40a1.png)
此时_a变量就可以被赋初值了。
在之后的学习中,我们要尽量使用初始化列表进行初始化因为不管是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化
成员变量在类中的声明次序就是其在初始化列表中的初始化顺序,和在初始化列表中的先后次序无关,看下面代码会导致什么样的结果
class Date
{
public:
Date(int year)
:_month(year)
,_year(_month)
{
}
void print()
{
cout << _year << " " << _month << endl;
}
private:
int _year;
int _month;
};
int main()
{
Dat

本文深入探讨了C++中类的构造函数特性,包括初始化列表、explicit关键字的用途,以及static成员的功能。强调了初始化列表在初始化const成员变量、自定义类型成员和引用成员变量时的重要性。此外,文章还介绍了友元函数和友元类的概念,以及内部类的特性。最后,讨论了拷贝对象时编译器的优化策略。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



