更新時間:2022-08-26 09:50:40 來源:動力節點 瀏覽924次
初始化列表是在構造函數中初始化對象數據成員的另一種技術。例如,構造函數
date::date(int m, int d, int y)
{
month = m;
day = d;
year = y;
}
可以改為使用初始化列表來編寫:
date::date(int m, int d, int y) : month(m), day(d), year(y)
{
}
內置類型和對象都可以使用初始化列表進行初始化。數組不能使用初始化列表進行初始化。
以這種方式初始化對象會導致構造函數調用。例如,如果一個被調用的類employee有一個date對象hire_date作為它的數據成員之一,我們可以使用一個初始化列表來初始化構造函數中的hire_date數據成員employee:
employee::employee(const string& name, int hire_month, int hire_day, int hire_year) :
employee_name(name), hire_date(hire_month, hire_day, hire_year)
{
}
如果類的數據成員與構造函數的參數同名,則初始化列表“做正確的事”。例如,
date::date(int month, int day, int year) : month(month), day(day), year(year)
{
}
大致相當于
date::date(int month, int day, int year)
{
this->month = month;
this->day = day;
this->year = year;
}
也就是說,編譯器知道哪個month屬于對象,哪個month是在成員函數中聲明的局部變量。
初始化階段:全部類類型(class type)的成員都會在初始化階段初始化,即便該成員沒有出如今構造函數的初始化列表中。code
計算階段:通常用于執行構造函數體內的賦值操做對象
使用常規構造函數賦值類對象:blog
#include <iostream>
using namespace std;
class Test_A
{
public:
Test_A()
{
cout<<"構造函數Test_A()"<<endl;
}
Test_A(const Test_A& t1)
{
cout<<"拷貝構造函數Test_A()"<<endl;
m_age = t1.m_age;
}
Test_A& operator = (const Test_A& t1)
{
cout<<"重載賦值運算符operator="<<endl;
m_age = t1.m_age;
return *this;
}
~Test_A()
{
cout<<"析構函數~Test_A()"<<endl;
}
public:
int m_age;
};
class Test_B
{
public:
Test_B(Test_A& t1)
{
m_b = t1;
}
public:
Test_A m_b;
};
/*此函數至關于一個舞臺,展現此函數內對象的完整生命周期*/
void display()
{
Test_A t1;
Test_B t2(t1);
}
int main()
{
display();
system("pause");
return 0;
}
輸出結果:生命周期
構造函數Test_A()
構造函數Test_A()
重載賦值運算符operator=
析構函數~Test_A()
析構函數~Test_A()
從輸出結果中能夠看出,在執行Test_B t2(t1)的過程:
先調用Test_A類的構造函數初始化成員對象 m_b (初始化階段)
而后再調用Test_A類的重載賦值運算符函數,將t1賦值給m_b。 (計算階段)
使用初始化列表(只需修改類Test_B中的構造函數):
class Test_B
{
public:
Test_B(Test_A& t1):m_b(t1){}; //使用了構造函數的初始化列表
public:
Test_A m_b;
};
輸出結果:
構造函數Test_A()
拷貝構造函數Test_A()
析構函數~Test_A()
析構函數~Test_A()
從輸出結果中能夠看出,執行Test_B t2(t1)的過程:
在初始化成員對象 m_b時,直接調用Test_A類的拷貝構造函數進行初始化。
1.性能的提升,對于內置類型,使用初始化列表和構造函數內賦值性能差異不是很大,可是對于類類型來講,使用初始化列表,減小了一次計算階段,若是是密集型類,效率將會更高。
2.成員的類型是沒有默認構造函數的類。若沒有提供顯示初始化式,則編譯器隱式使用成員類型的默認構造函數,若類沒有默認構造函數,則編譯器嘗試使用默認構造函數將會失敗,必須使用初始化列表
3.const成員或引用類型的成員。由于const對象或引用類型只能初始化,不能對他們賦值,必須使用初始化列表
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習