【C++ 初始化列表】

在 C++编程中,初始化列表(Initializer List)是一种在对象创建时进行成员变量初始化的强大工具。

一、什么是初始化列表

初始化列表是在构造函数的参数列表之后、函数体开始之前,使用冒号 : 后跟一组以逗号分隔的成员变量初始化表达式。

class MyClass {
    int num;
    std::string str;

public:
    MyClass(int n, const std::string& s) : num(n), str(s) {}
};

二、为什么使用初始化列表

  1. 效率优势
    对于一些类型,如引用和 const 成员变量,必须使用初始化列表进行初始化。而且对于没有默认构造函数的类成员,也只能通过初始化列表来正确初始化。

  2. 避免不必要的默认初始化
    使用初始化列表可以直接对成员变量进行指定值的初始化,避免了先进行默认初始化再赋值的两步操作,提高了性能。

三、初始化列表的顺序

初始化列表中成员变量的初始化顺序与它们在类中的声明顺序相同,而与初始化列表中的顺序无关。

class MyClass {
    int num1;
    int num2;

public:
    MyClass(int n1, int n2) : num2(n2), num1(n1) {}  // 错误的初始化顺序
};

上述代码中,尽管在初始化列表中 num2 先于 num1 ,但实际的初始化顺序仍然是先 num1num2 ,这可能导致意外的结果。

四、复杂类型的初始化

  • C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的
    成员使⽤的。
#include<iostream>
using namespace std;
class Time
{ 
public:
	Time(int hour)
	:_hour(hour)
	{
		cout << "Time()" << endl;
	}
private:
	int _hour;
};
class Date
{ 
public:
	Date()
	:_month(2)
	{	
		cout << "Date()" << endl;
	} 
	oid Print() const
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
// 注意这⾥不是初始化,这⾥给的是缺省值,这个缺省值是给初始化列表的
// 如果初始化列表没有显⽰初始化,默认就会⽤这个缺省值初始化
	int _year = 1;
	int _month = 1;
	int _day;
	Time _t = 1;
	const int _n = 1;
	int* _ptr = (int*)malloc(12);
};
int main()
{
	Date d1;
	d1.Print();
	return 0;
}

对于类类型的成员变量,如果其类有自定义的构造函数,也可以在初始化列表中调用相应的构造函数进行初始化,引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始
化,否则会编译报错。

class InnerClass {
public:
    InnerClass(int value) {}
};

class OuterClass {
    InnerClass inner;

public:
    OuterClass() : inner(42) {}
};

初始化列表为 C++提供了一种更清晰、高效和灵活的成员变量初始化方式。正确使用初始化列表可以避免一些潜在的错误,提高代码的性能和可读性。


希望通过这篇博客,您对 C++的初始化列表有了更深入的理解和认识。如果您有任何疑问或想法,欢迎在评论区交流分享!

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ヾ慈城

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值