初始化列表和構造函數初始化的區別是什么?
初始化和賦值對內置類型的成員沒有太大的區別,在成員初始化列表和構造函數體內進行,在性能和結果上都是一樣的。只有一些需要注意的事項
初始化列表一般情況如下:
Date(int year, int month, int day) : _year(year) , _month(month) , _day(day)
構造函數初始化一般通過構造函數實現,示例:
#include<iostream>
using namespace std;
class Date
{
public:Date(int year, int month, int day) {this->_day = day;this->_month = month;this->_year = year;}private:int _year;int _month;int _day;
};
上面的構造函數(使用初始化列表的構造函數)顯示地初始化類的成員,
而沒有使用初始化列表的構造函數是對類的成員賦值,并沒有進行顯示的初始化。
注意事項
1. 每個成員變量在初始化列表中只能出現一次(初始化只能初始化一次)
2. 類中包含以下成員,必須放在初始化列表位置進行初始化:
-
引用成員變量
-
const成員變量
-
類類型成員(該類沒有默認構造函數)
#include
using namespace std;
class Date
{
public:
Date(int year, int month, int day) {
this->_day = day;
this->_month = month;
this->_year = year;
}private:
int _year;
int _month;
int _day;int & _ref;//引用const int xxxxx;//const成員變量Date _lei;//類類型成員
};
3. 盡量使用初始化列表初始化,因為不管你是否使用初始化列表,對于自定義類型成員變量,一定會先使 用初始化列表初始化
哪怕自己沒有初始化列表,編譯器自己會加初始化列表,效率會高一些。
4. 成員變量在類中聲明次序就是其在初始化列表中的初始化順序,與其在初始化列表中的先后次序無關
盡量不要使用成員初始化成員
類的成員變量的初始化順序是按照聲明順序嗎
在c++中,類的成員變量的初始化順序只與變量在類中的聲明順序有關,與在構造函數中的初始化順序無關,而且靜態成員變量先于實例變量,父類成員變量先于子類成員變量父類析構函數先于子類構造函數
class Test{
public:Test(){};Test::Test()n2(2), n1(1)
private:int n1;int n2;};
成員變量的初始化次序跟變量在內存中的次序有關,而內存中的排列順序早在編譯期就根據變量的定義決定了
從全局看,變量的初始化順序如下:
- 基類的靜態變量或全局變量
- 派生類的靜態變量或全局變量
- 基類的成員變量
- 派生類的成員變量