日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++構造函數初始化列表的實現詳解_C 語言

作者:AKA.瞳源治 ? 更新時間: 2022-11-03 編程語言

1.前言

初始化就是給變量一個初始值。 初始化的目的是為了讓變量有值,防止使用時出現異常。

在構造函數中,有一項重要功能就是對成員變量進行初始化,一般我們采用兩個方法:

對成員變量賦值和采用初始化列表

2.初始化列表

在這之前我們來觀察一下樣例看這兩者之間有什么區別:

class Date
{
public:
	Date(int year = 1900, int month = 1, int date = 1)
	{
		_year = year;
		_month = month;
		_date = date;
	}//賦值
    Date(int year = 1900, int month = 1, int date = 1)
        :_year(year)
        ,_month(month)
        ,_date(date)
        {}//初始化列表
}

顯然的,初始化列表是以冒號開始,然后緊跟著的是以逗號為分隔符的數據成員列表,每個數據成員后面都有一個括號,括號中的是該成員變量的初始值或表達式。其中語句:

_year(year),_month(month),_date(date)

其實就是相當于函數體內部的:

_year = year;_month = month;_date = date;

雖然說效率上沒有什么很大區別,但使書寫更加方便,尤其在成員變量較多時優勢更加突出

3.注意事項

1.成員變量的初始化順序與初始化列表中列出的變量的順序無關,它只與成員變量在類中聲明的順序有關。

如代碼所示:

#include<iostream>
using namespace std;
class A
{
public:
	A(int a)
		:_a1(a)
		, _a2(_a1)
	{}
	void Print()
	{
		cout << _a1 << " " << _a2 << endl;
	}
private:
	int _a2;
	int _a1;
};
int main()
{
	A aa(1);
	aa.Print();
}

結果:

出現上面結果,是因為我們在類的聲明中的順序決定了成員變量的賦值,所以在 A類 中先讓 _a2 賦值,然而 _a1還未賦值,所以_a2 的值為一個奇怪的數字。

2.一般類中我們還需要定義某些特殊成員變量,初始化 這些成員變量的唯一方法就是使用初始化列表。

如代碼所示:

class B {
private:
	int& _b;
	const int _len;
	A _c;
	int* _a;
public:
	//B(int len, int b)
	//	: _len(len)
	//	,_b(b)
	//	,_c(0)
	//{
	//	_a = new int[len];
	//}
	B(int len, int b)
	{
		_len = len;
		_c = 0;
		_b = b;
		_a = new int[len];
	}
};

該代碼中如果用賦值來初始化成員變量的話,會報出以下錯誤:

所以,當類中包含了:引用成員變量;const成員變量;自定義類型的成員變量時,必須將這些成員放在初始化列表中進行初始化。

結果:

原文鏈接:https://blog.csdn.net/qq_64109690/article/details/126696883

欄目分類
最近更新