C++构造函数初始化列表,该怎么解决

C++构造函数初始化列表
我想问一下这两种方式有什么不同,及使用初始化列表与不使用初始化列表有什么区别?

C/C++ code

class base
{
public:
    base();
    base(int n);
    ~base();
private:
    int num;
};

base::base(int n):num(n){}  //使用初始化列表

base::base(int n)           //不使用初始化列表
{
    num(n);
}




------解决方案--------------------
初始化列表是初始化,而括号里可以看为赋值
对于POD来说差不多,但对于某种class类型,有效率的差别
------解决方案--------------------
如定义一个类的const成员变量,就需要在初始化列表中做初始化。
------解决方案--------------------
1,base::base(int n):num(n){} //使用初始化列表
// 初始化,
,2,base::base(int n) //不使用初始化列表
{
num(n);//这个是赋值
}

区别在于的是:有可能你先使用了该类的属性num,而导致了未定义,比如第二种
base::base(int n) :fun(num)
建议是采用第一种类来初始化



------解决方案--------------------
对于构造函数的初始化,可以看成是分两步进行的,第一步是在初始化列表中进行初始化,如果没有显式的在初始化列表中进行初始化,则采用默认的形式进行初始化,类类型采用默认构造函数进行初始化,其他的一般没有初始化值。第二步才进行函数体中的赋值。对于有些类型的变量必须要在初始化列表中进行初始化,比如像没有默认构造函数的类,还有上面的const变量等,如果不在初始化列表中进行初始化就会出错。
------解决方案--------------------
参考:
初始化列表问题