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

来源:互联网 发布:开关电源设计仿真软件 编辑:程序博客网 时间:2024/06/06 17:31

由面试引出的一道题:

面试时被问到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;}
输出结果为:



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

0 0
原创粉丝点击