C++ 类:构造函数(2)

1. 构造函数初始值列表初始化与构造函数内赋值

class test
{
public:
    test()
    {
        a = 10;	  // 构造函数内赋值(实际上在调用函数时,已经对a进行了初始化为0,此处是再次进行赋值)
    }
public: 
    int a;
};
class test
{
public:
    test() : a(10) {}	// 利用构造函数列表进行初始化
public: 
    int a;
};

注意:虽然上述两种法效果相同:当构造函数完成后,数据成员的值相同。区别是第一个版本,先初始化了数据成员,又进行了赋值操作。第二个写法是,只对数据成员进行了初始化操作。从效率上来看,使用构造函数初始值的方法高效。

2. 构造函数的初始值,有时必不可少

有时可以忽略数据成员初始化和赋值之间的差异。如果成员时const或者引用的话,必须将其初始化。

class test
{
public:
    test(int ii)
    {
        i = ii;		// 正确正常赋值
        j = ii;		// 【错误】: 不能给const赋值
        k = i;		// 【错误】: k没有被初始化,不能直接赋值
    }
public:
    int i;
    const int j;
    int &k;
};

随着构造函数体一开始执行,初始化就完成了。我们初始化const或者引用类型的数据成员的唯一机会就是通过构造函数初始值。正确的构造函数形式为:

class test
{
public:
    test(int ii) : i(ii), j(ii), k(i);
public:
    int i;
    const int j;
    int &k;
};

注意:如果成员为const、引用,或者属于某种未提供默认构造函数的类型,我们必须通过构造函数初始值列表对这些成员进行初始化。

3.成员的初始化顺序

struct test
{
public: 
    int a;
    int b;
public:
    test(int ii) : b(ii), a(b);	 // 【错误】: 未定义,a在b之前初始化
};

注意:成员的初始化顺序,与他们在类中定义的顺序相同,与构造函数的初始值列表顺序无关。上述类成员函数的初始化顺序为:先初始化a,然后初始化b。

4.委托构造函数

C++11 新标准扩展了构造函数初始值的功能,使我们可以定义所谓的委托构造函数

委托构造函数也有一个成员初始值列表和一个函数体。在委托构造函数内,成员的初始值列表只有一个入口,就是类名本身。和其他成员初始值一样,类名后面紧跟圆括号括起来的参数列表,参数列表必须与另外一个构造函数匹配。

当一个构造函数委托给另一个构造函数时,受委托的函数的初始值列表和函数体依次被执行。然后才会执行委托函数的函数体。

#include <iostream>
struct test
{
public:
   //非委托的构造函数,初始化成员函数
    test(int i, int j) : a(i),b(j) {std::cout << a << b << std::endl;};
   //其余委托函数全都委托另一个构造函数
    test() : test(1, 1){};
    test(int i) : test(i, 1){};

public:
    int a;
    int b;    
  
};

int main()
{
    test m;
    test n(1);
    test o(1,1);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值