最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++類中的六大默認(rèn)成員函數(shù)詳解

 更新時(shí)間:2021年04月13日 11:28:41   作者:wuqiongjin  
這篇文章主要介紹了C++類中的六大默認(rèn)成員函數(shù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

在C++中,當(dāng)你去創(chuàng)建一個(gè)類的時(shí)候,即便這個(gè)類是空類,也會(huì)自動(dòng)生成下面6個(gè)默認(rèn)成員函數(shù),在本篇博客中,我將逐一分析下面6個(gè)默認(rèn)成員函數(shù)。

構(gòu)造函數(shù)

構(gòu)造函數(shù)并不是去構(gòu)造函數(shù)的函數(shù),而是去對(duì)函數(shù)進(jìn)行初始化的函數(shù)。構(gòu)造函數(shù)的函數(shù)名與類名相同,當(dāng)我們每次創(chuàng)建類對(duì)象的時(shí)候,就會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)。構(gòu)造函數(shù)在對(duì)象的生命周期中只會(huì)調(diào)用1次。

class Date
{
public:
    //構(gòu)造函數(shù)
	Date(int year = 2021, int month = 4, int day = 11)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

構(gòu)造函數(shù)的幾個(gè)特點(diǎn)

①函數(shù)名與類名相同

②無返回值

③對(duì)象實(shí)例化時(shí)編譯器自動(dòng)調(diào)用對(duì)應(yīng)的構(gòu)造函數(shù)

④構(gòu)造函數(shù)可以重載

class Date
{
public:
    //構(gòu)造函數(shù)的重載:
    //無參的構(gòu)造函數(shù)
	Date()
	{}
    //需要傳參的構(gòu)造函數(shù)
	Date(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

⑤如果類中沒有顯式定義構(gòu)造函數(shù)(就是自己沒有去定義構(gòu)造函數(shù)),那么編譯器會(huì)自動(dòng)生成一個(gè)無參的默認(rèn)構(gòu)造函數(shù);

如果類中顯式定義了構(gòu)造函數(shù),那么編譯器將不再生成,而是去使用用戶定義的構(gòu)造函數(shù)。

⑥默認(rèn)構(gòu)造函數(shù)只能同時(shí)存在1個(gè)。默認(rèn)構(gòu)造函數(shù)分為以下3種:①無參的構(gòu)造函數(shù) ②全缺省的構(gòu)造函數(shù) ③編譯器默認(rèn)生成的構(gòu)造函數(shù)

默認(rèn)構(gòu)造函數(shù)的共同特點(diǎn)是:不用傳參就可以調(diào)用

class Date
{
public:
	//下面2種和 當(dāng)你不寫構(gòu)造函數(shù)時(shí)編譯器自動(dòng)生成的默認(rèn)構(gòu)造函數(shù)只能同時(shí)存在1種
    //無參的
	Date()
	{
		_year = 2021;
		_month = 4;
		_day = 11;
	}
    //全缺省的
	Date(int year = 2021, int month = 4, int day = 11)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

⑦編譯器生成的默認(rèn)的構(gòu)造函數(shù),對(duì)內(nèi)置類型(int, char, double...)不會(huì)做任何處理,但是會(huì)針對(duì)自定義類型的成員,調(diào)用它的構(gòu)造函數(shù)去進(jìn)行初始

構(gòu)造函數(shù)調(diào)用的2種寫法:

int main()
{
    //無參時(shí)
    Date d;
    //單個(gè)參數(shù)
	Date(1);
	Date d1 = 2;//這種寫法會(huì)發(fā)生隱式類型轉(zhuǎn)換
    //多個(gè)參數(shù)
    Date(2021, 4, 11);
    Date d2 = {2021, 4, 11};//C++11中才支持的寫法
}

構(gòu)造函數(shù)與初始化列表

初始化列表:以冒號(hào)開始,接著是一個(gè)以逗號(hào)分隔的數(shù)據(jù)成員列表,每個(gè)"成員變量"后面跟一個(gè)放在括號(hào)中的初始值或表達(dá)式。

初始化列表有什么用?

初始化列表,顧名思義就是對(duì)對(duì)象進(jìn)行初始化的,但是我們已經(jīng)可以在構(gòu)造函數(shù)體內(nèi)進(jìn)行初始化了(通過對(duì)成員變量進(jìn)行賦值來進(jìn)行初始化),為什么還需要初始化列表?

這是因?yàn)?,有些類型的?shù)據(jù)無法通過在構(gòu)造函數(shù)體內(nèi)進(jìn)行賦值來進(jìn)行初始化。這樣的數(shù)據(jù)類型有下面3種:

  1. 引用成員變量
  2. const成員變量
  3. 自定義類型成員 (且它的類沒有默認(rèn)構(gòu)造函數(shù)[即,它必須要進(jìn)行傳參])

上面的三種數(shù)據(jù)類型有一個(gè)共同的特點(diǎn),它們都要求你在定義變量的時(shí)候進(jìn)行賦值。

比如,引用成員變量,使用引用的時(shí)候必須進(jìn)行初始化,否則語法就是錯(cuò)誤的。

析構(gòu)函數(shù)

析構(gòu)函數(shù)的作用與構(gòu)造函數(shù)相反,在對(duì)象的生命周期結(jié)束的時(shí)候會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),完成類的一些資源清理的工作。

析構(gòu)函數(shù)的特點(diǎn)

  • 析構(gòu)函數(shù)名是在類名的前面加上~
  • 無參,無返回值
  • 一個(gè)類中有且只有1個(gè)析構(gòu)函數(shù)。如果未顯式定義,系統(tǒng)會(huì)自動(dòng)生成默認(rèn)的析構(gòu)函數(shù)。(如果定義了,則采用顯式定義的)
  • 對(duì)象生命周期結(jié)束時(shí),C++編譯系統(tǒng)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)
  • 編譯器生成的默認(rèn)的析構(gòu)函數(shù),對(duì)內(nèi)置類型(int, char, double...)不會(huì)做任何處理,但是會(huì)針對(duì)自定義類型的成員,會(huì)去調(diào)用它的析構(gòu)函數(shù)

析構(gòu)函數(shù)的一般使用情況:

一般使用在那些涉及到動(dòng)態(tài)內(nèi)存開辟空間的類中,因?yàn)檫@樣的對(duì)象需要對(duì)其動(dòng)態(tài)開辟的空間進(jìn)行釋放。

class Stack
{
public:
    //構(gòu)造函數(shù)
	Stack(int n = 3)
	{
		_a = (int*)malloc(sizeof(int)*n);
		_size = 0;
		_capacity = n;
	}
    //析構(gòu)函數(shù)
	~Stack()
	{
		free(_a);
		_size = _capacity = 0;
	}
private:
	int* _a;
	int _size;
	int _capacity;
};

拷貝構(gòu)造函數(shù)

拷貝構(gòu)造函數(shù):只有單個(gè)形參,該形參是對(duì)本類類型對(duì)象的引用(一般常用const修飾),在用已存在的類類型對(duì)象去創(chuàng)建新的對(duì)象時(shí),編譯器會(huì)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。

拷貝構(gòu)造函數(shù)的特點(diǎn)

  • 拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)的一個(gè)重載
  • 拷貝構(gòu)造函數(shù)的參數(shù)只有1個(gè),且必須使用引用傳參,如果使用引用傳值的形式會(huì)引發(fā)無限遞歸。

拷貝構(gòu)造函數(shù)的2種調(diào)用方法(完全等價(jià)的):

int main()
{
	Date d1(1);
	//拷貝構(gòu)造函數(shù)
	Date d2(d1);  //1
	Date d3 = d1; //2
 
	return 0;
}

賦值運(yùn)算符重載

在了解賦值運(yùn)算符重載之前,我們需要先知道什么是運(yùn)算符重載。

運(yùn)算符重載

運(yùn)算符重載是具有特殊函數(shù)名的函數(shù)。

函數(shù)名:關(guān)鍵字operator后面接需要重載的運(yùn)算符符號(hào)(如:operator>)

函數(shù)原型:返回類型 operator操作符 (參數(shù)列表)

注意:

  • operator后面必須跟著的是操作符(這樣是不可以的 operator@)
  • 重載操作符必須有一個(gè)類類型或者枚舉類型的操作數(shù)
  • 用于內(nèi)置類型的操作符,其含義無法改變。(比如內(nèi)中的整型+,3+5這其中的+的意義不會(huì)改變)
  • this指針為限定的第一個(gè)形參,也就是this作為第一個(gè)操作數(shù)
  • .*、::、sizeof、?:、. 這5個(gè)操作符無法進(jìn)行重載。

賦值運(yùn)算符重載

class Date
{
public:
	Date(int year = 2021, int month = 4, int day = 11)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	//賦值運(yùn)算符重載
	Date& operator=(const Date& d)
	{
		_year = d._day;
		_month = d._month;
		_day = d._day;
		return *this;
	}
private:
	int _year;
	int _month;
	int _day;
};

注意:賦值運(yùn)算符重載必須有返回值,如果沒有返回值的話,無法解決 a = b = c 這種連續(xù)賦值的操作。

拷貝構(gòu)造函數(shù)與賦值運(yùn)算符重載

Date d1(1);
	Date d2(0);
	
	//賦值運(yùn)算符重載
	d2 = d1;     //注意,只有2個(gè)操作數(shù)都是已經(jīng)定義過的變量時(shí),才會(huì)調(diào)用賦值運(yùn)算符重載
 
	//拷貝構(gòu)造函數(shù)
	Date d3(d1);

淺拷貝

淺拷貝是你在沒有寫拷貝構(gòu)造函數(shù)和operator=時(shí),編譯器自動(dòng)調(diào)用的默認(rèn)成員函數(shù)。它的功能是將對(duì)象以字節(jié)的為單位拷貝過去。

取地址與const取地址操作符重載

這兩個(gè)運(yùn)算符一般不需要重載,使用編譯器生成的默認(rèn)取地址的重載即可(編譯器默認(rèn)的基本就夠用了),只有特殊情況,才需要重載,比如想讓別人獲取到指定的內(nèi)容。

class Date
{
public:
    //取地址操作符重載
	Date* operator&()
	{
		return this;
	}
    //const取地址操作符重載
	const Date* operator&()const
	{
		return this;
	}
private:
	int _year;
	int _month;
	int _day;
};

到此這篇關(guān)于C++類中的六大默認(rèn)成員函數(shù)的文章就介紹到這了,更多相關(guān)C++類默認(rèn)成員函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

class Date
{
public:
    //初始化列表
	Date(int year, int month, int day)
		:_year(year),
		 _month(month),
		 _day(day)
	{}
 
private:
	int _year;
	int _month;
	int _day;
};

相關(guān)文章

  • C++字符串反轉(zhuǎn)的幾種方法

    C++字符串反轉(zhuǎn)的幾種方法

    通過不同的方法,實(shí)現(xiàn)對(duì)所輸入字符串的反轉(zhuǎn),具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • C++中l(wèi)ist的使用與模擬實(shí)現(xiàn)

    C++中l(wèi)ist的使用與模擬實(shí)現(xiàn)

    list相較于vector來說會(huì)顯得復(fù)雜,它的好處是在任意位置插入,刪除都是一個(gè)O(1)的時(shí)間復(fù)雜度,下面這篇文章主要給大家介紹了關(guān)于C++中l(wèi)ist的使用與模擬實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 詳解C標(biāo)準(zhǔn)庫堆內(nèi)存函數(shù)

    詳解C標(biāo)準(zhǔn)庫堆內(nèi)存函數(shù)

    在C/C++語言中,我們知道內(nèi)存分為這幾種:程序全局變量?jī)?nèi)存、棧內(nèi)存、堆內(nèi)存。其中堆內(nèi)存就是通過malloc(new)來分配的內(nèi)存,本文我們來探討一下C標(biāo)準(zhǔn)庫堆內(nèi)存函數(shù)。
    2021-06-06
  • C語言使用realloc函數(shù)實(shí)現(xiàn)通訊錄源碼分析

    C語言使用realloc函數(shù)實(shí)現(xiàn)通訊錄源碼分析

    什么是動(dòng)態(tài)通訊錄,就是在靜態(tài)的基礎(chǔ)上改進(jìn)了一下,不在使用數(shù)組,而是使用指針和動(dòng)態(tài)內(nèi)存開辟的函數(shù),當(dāng)空間不夠的時(shí)候,便進(jìn)行增容
    2023-02-02
  • C語言中的long型究竟占4個(gè)字節(jié)還是8個(gè)字節(jié)(遇到的坑)

    C語言中的long型究竟占4個(gè)字節(jié)還是8個(gè)字節(jié)(遇到的坑)

    小編在復(fù)習(xí)C語言的時(shí)候踩到了不少坑,糾結(jié)long類型究竟占4個(gè)字節(jié)還是8個(gè)字節(jié)呢?好,今天通過本文給大家分享下我的詳細(xì)思路,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • C++中的函數(shù)匯總

    C++中的函數(shù)匯總

    這篇文章主要介紹了 C++中的函數(shù)匯總的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • 深入解析C++ STL中的常用容器

    深入解析C++ STL中的常用容器

    這里我們不涉及容器的基本操作之類,只是要討論一下各個(gè)容器其各自的特點(diǎn)。STL中的常用容器包括:順序性容器(vector、deque、list)、關(guān)聯(lián)容器(map、set)、容器適配器(queue、stac)
    2013-09-09
  • C++遍歷某個(gè)文件夾下面的子文件夾及其所有文件

    C++遍歷某個(gè)文件夾下面的子文件夾及其所有文件

    這篇文章主要介紹了C++獲取某個(gè)文件夾下面的子文件夾及其所有文件,需要的朋友可以參考下
    2021-07-07
  • C++ Boost Archive超詳細(xì)講解

    C++ Boost Archive超詳細(xì)講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱。Boost庫是一個(gè)可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴(kuò)展的一些C++程序庫的總稱
    2022-12-12
  • C語言中feof函數(shù)和ferror函數(shù)示例詳解

    C語言中feof函數(shù)和ferror函數(shù)示例詳解

    在C語言中feof函數(shù)用于檢查文件流的結(jié)束標(biāo)志,判斷文件在讀取時(shí)是否已經(jīng)到達(dá)了文件的末尾,這篇文章主要給大家介紹了關(guān)于C語言中feof函數(shù)和ferror函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2024-09-09

最新評(píng)論

山阳县| 化德县| 体育| 桦川县| 平顺县| 瑞金市| 定结县| 大港区| 岳普湖县| 广元市| 开远市| 凉山| 车致| 娄烦县| 丁青县| 昌宁县| 卓尼县| 合作市| 襄城县| 苏尼特左旗| 洪雅县| 广州市| 高安市| 辽源市| 同德县| 泸定县| 桂阳县| 耿马| 略阳县| 凭祥市| 尚志市| 杂多县| 慈溪市| 格尔木市| 滕州市| 孝义市| 登封市| 龙胜| 忻城县| 泾源县| 屏南县|