大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 構造函數的初始化列表

構造函數的初始化列表

更新時間: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是在成員函數中聲明的局部變量。

構造函數執行的兩個階段.net

初始化階段:全部類類型(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對象或引用類型只能初始化,不能對他們賦值,必須使用初始化列表

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 欧美性xxxxxx爱| 国产视频一区二 | 欧美第一视频 | 色综合久久网 | 在线视频一区二区三区四区 | 久久aa毛片免费播放嗯啊 | 四虎影视永久免费观看地址 | 欧美精品一区二区三区视频 | 亚洲成年网站 | 欧美激情久久欧美激情 | 国产二区在线播放 | 九九热线| 午夜精品久久久久久久四虎 | 91伦理| 久久综合九色综合97伊人麻豆 | 精品欧美一区二区在线观看 | 春暖花开亚洲 | 亚洲精品区 | 久久天天躁夜夜躁狠狠85麻豆 | 日韩欧美精品有码在线观看 | 日韩一区二区在线观看 | 国产欧美专区在线观看 | 国产三级日产三级日本三级 | 99久久99久久 | 天天看天天爽 | 一级黄色录像免费看 | 亚洲精品国产综合一线久久 | 国产精品一区在线播放 | 羞羞网址| 国产亚洲精品激情一区二区三区 | 欧美成人性做爰 | 国产精品四虎视频一区 | 久久99久久精品97久久综合 | 色香欲综合网 | 中文字幕国产综合 | 美女久久久久 | 中文字幕日韩国产 | 国产精品原创巨作无遮挡 | 九九视频九九热 | 一级欧美一级日韩毛片99 | 亚洲日本久久一区二区va |