构造函数初始化列表

在构造函数中,有时必须使用初始化列表对对象成员进行初始化。

如果不使用初始化列表,而是在构造函数函数体内进行赋值,例如构造函数如下所示:

calss A{

public:

A()

{

a = 0;

b = 0;

}

pravite:

int a;

int b;

};

那么在创建一个A类型的对象时,A tmp,此时将会默认调用无参构造函数,构造的过程首先对对象的数据成员a、b进行初始化,然后再在无参构造函数体内对数据成员a、b进行重新赋值。

如果数据成员对应的类型没有无参构造函数,那么以上过程中对数据成员的初始化就会出现错误。

如果数据成员为const或者引用类型,那么在无参构造函数体内对数据成员进行赋值的操作就会失败。

例如,如果类A定义如下所示:

calss A{

public:

A()

{

a = 0;

b = 0;

}

pravite:

const  int a;

int b;

};

那么无参构造函数就会出现错误,因为无法对a进行赋值。此时类定义应该改为:

calss A{

public:

A():a(0)

{

b = 0;

}

pravite:

int a;

int b;

};


所以,必须对为const或者引用类型以及没有无参构造函数的类类型的任何成员使用初始化列表。

成员初始化次序与成员初始化列表中的成员顺序无关,初始化的次序和类中定义成员顺序一致。

C++构造函数初始化列表是一种在构造函数初始化类成员变量和基类构造函数的特殊语法。它以冒号(:)开始,后跟一个或多个初始化项,每个初始化项由成员变量名或基类名和构造列表组成,各项之间用逗号分隔。 构造函数初始化列表的主要优势如下: 1. 效率更高:对于成员变量的初始化,尤其是const成员变量或引用类型的成员,构造函数初始化列表是必须使用的。与在构造函数体内赋值相比,初始化列表直接调用构造函数或赋值运算符来初始化成员变量,避免了不必要的拷贝或赋值操作,提高了效率。 2. 避免空缺问题:当成员变量为const或引用类型时,它们必须在构造函数中被初始化,因为它们不能被赋值。此时,初始化列表是唯一选择。 3. 对象的成员如果是类对象,使用初始化列表可以直接调用相应类的构造函数进行初始化,而不需要先默认构造再赋值,从而提高效率。 使用示例: ```cpp class Base { public: int baseValue; Base(int b) : baseValue(b) {} // 基类构造函数使用初始化列表 }; class Derived : public Base { public: int derivedValue; Derived(int b, int d) : Base(b), derivedValue(d) {} // 继承自Base,并初始化Derived的成员变量 }; ``` 在这个例子中,Derived类的构造函数使用初始化列表先调用基类Base的构造函数初始化基类部分,再初始化自己特有的成员变量derivedValue。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值