本系列 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 =”必须是非静态成员 | 赋值运算符的重载的说明及其写法(特殊点)