c++构造函数中初始化列表的作用和机制

来源:互联网 发布:window7连接网络打印机 编辑:程序博客网 时间:2024/06/14 04:41

c++中构造函数有初始化列表,目的是用于变量的初始化。

 

百度初始化列表会告诉你初始化列表能够提高构造函数的性能,在派生类中可以跳过基类构造函数,直接进行赋值操作。下面是一常见派生类中使用初始化列表的例子。

class A{public:A(int i = 0):a(i){} //基类初始化成员变量protected:int a;};class B :public A{public:B():a(5){}//派生类不能初始化基类成员变量};
这样是正确的:
#include<iostream>usingnamespace std;class A{protected:int a;public:A(int i = 0):a(i) {}};class B :public A{public:B():A(5){}//基类的成员函数void printinfo(){cout<< a<< endl;}};
也可以这样:
#include<iostream>usingnamespace std;class A{public:A(int i = 0):a(i) {}protected:int a;};class B :publicA{public: B() {a=5;}};

 

其中为什么要使用初始化列表是因为:

1.常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面;
2.引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面
3. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化。
 
另外一个重点问题是:成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的。
#include <iostream>#include <string>using namespace std;class base{private:int m_i;int m_j;public:base(int i): m_j(i), m_i(m_j){}//这里改变顺序base():m_j(0),m_i(m_j){}int get_i(){return m_i;}int get_j(){return m_j;}};class A{static const int size=0;//静态,常量,整型才可以直接初始化。其他都不可以。};int main(int argc, char* argv){base obj(98);cout<<obj.get_i()<<endl<<obj.get_j()<<endl;base nn;cout<<nn.get_i()<<endl<<nn.get_j()<<endl;A nb;return 0;}

这里就有一个有趣的问题,虽然m_j出现在m_i前面,但m_i在m_j前面定义,所以先初始化m_i,此时m_j还是随机数,所以m_i就被初始化为一个随机数。
建议:按照成员的定义顺序进行初始化!

 

0 0
原创粉丝点击