类和对象(7):初始化列表

cpp 复制代码
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;
};

构造函数体内的语句只能称为赋初值,不能称为初始化。初始化只能初始化一次,而构造函数体内可以多次赋值。

一、初始化列表

1.1 定义

初始化列表:以一个:开始,用,分隔 的数据成员列表,每个"成员变量"后跟一个(),其中放初始值或表达式

cpp 复制代码
// Date类
Date(int year = 1, int month = 1, int day = 1)
    :_year(year)
    ,_month(month)
    ,_day(day)
{}
cpp 复制代码
// Stack类
class Stack()
{
public:
    Stack(int capacity = 3)
        :_a((int*)malloc(sizeof(int) * capacity))
        ,_top(0)
        ,_capacity(capacity)
    {
    	if (nullptr == _a) 
        {
            perror("malloc");
		}
    }
private:
    int* _a;
    int _top;
    int _capacity;
}

PS:

  1. 每个成员变量只能在初始化列表出现一次 。(只能初始化一次

  2. 类中包含引用成员变量const成员变量自定义类型成员(且该类没有默认构造函数时),必须在初始化列表进行初始化

cpp 复制代码
class A
{
public:
	A(int a)
		:_a(a)
	{}
private:
	int _a;
};

class B
{
public:
	B(int d = 1)
		:_a1(1)// 没有默认构造函数
		,_b(d)// 引用成员变量
		,_b2(2)// const成员
	{}
private:
	A _a1;
	int& _b;
	const int _b2;
};

除此以外,初始化列表和函数体可以混用 ,如上Stack类中情形。

  1. 成员变量在类中的声明次序就是成员变量在初始化列表中初始化顺序,与其在初始化列表中出现先后无关。

观察以下情形:

cpp 复制代码
class A
{
public:
	A(int a)
		:_a1(a)
		,_a2(_a1)
	{}
private:
	int _a2;
	int _a1;
};

int main()
{
	A a(1);
	return 0;
}
相关推荐
6Hzlia26 分钟前
【Hot 100 刷题计划】 LeetCode 287. 寻找重复数 | C++ 数组判环 (快慢指针终极解法)
c++·算法·leetcode
qq_120840937140 分钟前
Three.js 工程向:GLTFLoader 管线、Draco/KTX2 与资源管理
开发语言·javascript·ecmascript
下地种菜小叶1 小时前
定时任务系统怎么设计?一次讲清任务注册、分布式调度、幂等执行与失败补偿
java·开发语言·数据库·oracle·rabbitmq
csbysj20201 小时前
业务代表模式
开发语言
sghuter1 小时前
AI重塑工程师:未来核心能力全景图
开发语言·perl·composer·symfony
浪客川1 小时前
【百例RUST - 013】泛型
开发语言·后端·rust
Robot_Nav2 小时前
DPMPC-Planner:复杂静态环境与动态障碍物下的无人机实时轨迹规划框架
c++·无人机·mpc
iiiiyu2 小时前
常用API(SimpleDateFormat类 & Calendar类 & JDK8日期 时间 日期时间 & JDK8日期(时区) )
java·大数据·开发语言·数据结构·编程语言
故事和你912 小时前
洛谷-数据结构1-4-图的基本应用2
开发语言·数据结构·算法·深度优先·动态规划·图论
qq_12084093712 小时前
Three.js 工程向:Clock、deltaTime 与固定步长主循环
开发语言·javascript·ecmascript