C++ 初始化列表的构造函数

本文探讨了C++中类的构造函数,特别是初始化列表的作用和优势。初始化列表主要用于提高性能,特别是在处理类类型成员时,避免了额外的默认构造函数调用。同时,它还是初始化const成员、引用及没有默认构造函数的类类型成员的必要方式。成员初始化顺序遵循它们在类定义中的顺序,而非初始化列表的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由面试引出的一道题:

面试时被问到C++的一个类至少有几个函数?

我们都知道一个类默认都有构造函数和析构函数,除此之外还有两个重要的函数,那就是拷贝构造函数和赋值函数。

struct Test1
{
    Test1() // 无参构造函数
    { 
        cout << "Construct Test1" << endl ;
    }

    Test1(const Test1& t1) // 拷贝构造函数
    {
        cout << "Copy constructor for Test1" << endl ;
        this->a = t1.a ;
    }

    Test1& operator = (const Test1& t1) // 赋值运算符
    {
        cout << "assignment for Test1" << endl ;
        this->a = t1.a ;
        return *this;
    }

    int a ;
};
为什么要是使用初始化列表的构造函数?

初始化类的成员有两种方式,一是使用初始化列表,二是在构造函数体内进行赋值操作。使用初始化列表主要是基于性能问题,对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表,为什么呢?使用初始化列表少了一次调用默认构造函数的过程,这对于数据密集型的类来说,是非常高效的。

如下两种方式的构造函数,使用初始化列表的构造函数会比不使用初始化列表的构造函数少调用一次默认构造函数

struct Test2
{
    Test1 test1 ;
    Test2(Test1 &t1):test1(t1){}
}
Test1 t1;
Test2 t2(t1);

struct Test2
{
    Test1 test1 ;
    Test2(Test1 &t1)
    {
        test1 = t1 ;
    }
Test t1;
Test2 t2(t1);


哪些东西放在初始化列表中?

  • const 成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面
  • 引用,引用必须初始化。
  • 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化




成员变量的初始化顺序?

#include <iostream>

using namespace std;

class A{
private:
    int j,i;
public:
    A(int num):i(++num),j(++num){
        cout<<"num:"<<num<<endl;
    }
    fun(){
        cout<<i<<","<<j<<endl;
    }
};

int main()
{
    int val=3;
    A a(val);
    a.fun();
    return 0;
}
输出结果为:



成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值