本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:
- 基础篇:类与对象(涉及C++的三大特性等);
- STL 篇:学习使用 C++ 提供的 STL 相关库;
- 高阶数据结构与算法篇: 手动实现自己的 STL 库 及 设计实现高阶数据结构,如 B树、B+树、红黑树等。
学习集:
- C++ 入门到入土!!!学习合集
- Linux 从命令到网络再到内核!学习合集
本期内容:【C++ 基础篇:19】:类的构造函数与初始化列表:用法说明及构造函数的细节内容补充!
相关内容:
C++ 学习 ::【基础篇:12】:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)
C++ 学习 ::【基础篇:13】:类的基本成员函数:类类型成员与构造函数问题
目录:
1. 再谈构造函数:赋值 & 初始化
2. 初始化列表基本认识及使用
- - 2.1 基本认识及使用写法
- - 2.2 注意点说明(超重点!)
3. 相关文章推荐
【 C++学习合集链接 】
1. 再谈构造函数:赋值 & 初始化
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。【此前学习后的基本写法如下】
class Date
{
public :
    Date(int year = 1900, int month = 1, int day = 1)
    {
       _year = year;
       _month = month;
       _day = day;
    }
private:
    int _year ;
    int _month ;
    int _day ;
};
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。
因为初始化只能初始化一次,而构造函数体内可以多次赋值。
2. 初始化列表基本认识及使用
2.1 基本认识及使用写法
初始化列表:
- 以一个冒号开始,接着是一个以逗号分隔的数据成员列表,
- 每个"成员变量"后面跟一个放在括号中的初始值或表达式。
上述示例修改:程序代码如下:
class Date
{
public:
    Date(int year = 1900, int month = 1, int day = 1)
        :_year(year)		/* 初始化列表的基本写法 */
        ,_month(month)		/* 冒号开头 */
        ,_day(day)			/* 数据成员间,逗号间隔 */
    {
    }
private:
    int _year;
    int _month;
    int _day;
};
2.2 注意点说明(超重点!)
- 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
- 类中包含以下成员,必须放在初始化列表位置进行初始化:
- 引用成员变量(引用必须在定义的地方初始化)
- const 成员变量(const 修饰的变量必须在定义的地方初始化)
- 自定义类型成员(且该类没有默认构造函数时)
- 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。
- 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关!
- 注:初始化列表不能初始化静态成员变量(静态成员变量【类内声明】只能在类为定义)
类中包含以下成员,必须放在初始化列表位置进行初始化:
- 引用成员变量(引用必须在定义的地方初始化)
- const 成员变量(const 修饰的变量必须在定义的地方初始化)
- 自定义类型成员(且该类没有默认构造函数时)
错误示例情况如下图:

正确写法!如下!
class A
{
public:
	A(int a)
		:_a(a)
	{}
private:
	int _a;
};
class B
{
public:
	B(int a, int ref)
		:_aobj(a)		
		, _ref(ref)
		, _n(10)
	{}
private:
	A _aobj;		// 没有默认构造函数
	int& _ref;		// 引用
	const int _n;	// const
};
「成员变量」在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关!【如下图解析所示】

3. 相关文章推荐
1. C++ 学习 ::【基础篇:12】:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)
2. C++ 学习 ::【基础篇:13】:类的基本成员函数:类类型成员与构造函数问题
3. C++ 学习 ::【基础篇:14】:C++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形
4. C++ 学习 ::【基础篇:15】:C++ 类的基本成员函数:析构顺序问题(全局/静态/局部量) 及 类类型(自定义类型)与析构函数
5. C++ 学习 ::【基础篇:16】:C++ 类的基本成员函数:拷贝构造函数(认识、特征、注意点及典型使用场景)及其基本写法与调用
6. C++ 学习 ::【基础篇:17】:C++ 类与对象:运算符重载介绍、运算符重载函数(类内与类外区别)写法及简单设计实现
7. C++ 学习 ::【基础篇:18】:C++ 类的基本成员函数:error C2801: “operator =”必须是非静态成员 | 赋值运算符的重载的说明及其写法(特殊点)



















