C++類中的六大默認(rèn)成員函數(shù)詳解
在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ù)名與類名相同
②無(wú)返回值
③對(duì)象實(shí)例化時(shí)編譯器自動(dòng)調(diào)用對(duì)應(yīng)的構(gòu)造函數(shù)
④構(gòu)造函數(shù)可以重載
class Date { public: //構(gòu)造函數(shù)的重載: //無(wú)參的構(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; };
⑤如果類中沒(méi)有顯式定義構(gòu)造函數(shù)(就是自己沒(méi)有去定義構(gòu)造函數(shù)),那么編譯器會(huì)自動(dòng)生成一個(gè)無(wú)參的默認(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種:①無(wú)參的構(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種 //無(wú)參的 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() { //無(wú)參時(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)開(kāi)始,接著是一個(gè)以逗號(hào)分隔的數(shù)據(jù)成員列表,每個(gè)"成員變量"后面跟一個(gè)放在括號(hào)中的初始值或表達(dá)式。
初始化列表有什么用?
初始化列表,顧名思義就是對(duì)對(duì)象進(jìn)行初始化的,但是我們已經(jīng)可以在構(gòu)造函數(shù)體內(nèi)進(jìn)行初始化了(通過(guò)對(duì)成員變量進(jìn)行賦值來(lái)進(jìn)行初始化),為什么還需要初始化列表?
這是因?yàn)?,有些類型的?shù)據(jù)無(wú)法通過(guò)在構(gòu)造函數(shù)體內(nèi)進(jìn)行賦值來(lái)進(jìn)行初始化。這樣的數(shù)據(jù)類型有下面3種:
- 引用成員變量
- const成員變量
- 自定義類型成員 (且它的類沒(méi)有默認(rèn)構(gòu)造函數(shù)[即,它必須要進(jìn)行傳參])
上面的三種數(shù)據(jù)類型有一個(gè)共同的特點(diǎn),它們都要求你在定義變量的時(shí)候進(jìn)行賦值。
比如,引用成員變量,使用引用的時(shí)候必須進(jìn)行初始化,否則語(yǔ)法就是錯(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ù)名是在類名的前面加上~
- 無(wú)參,無(wú)返回值
- 一個(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)存開(kāi)辟空間的類中,因?yàn)檫@樣的對(duì)象需要對(duì)其動(dòng)態(tài)開(kā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ā)無(wú)限遞歸。
拷貝構(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)置類型的操作符,其含義無(wú)法改變。(比如內(nèi)中的整型+,3+5這其中的+的意義不會(huì)改變)
- this指針為限定的第一個(gè)形參,也就是this作為第一個(gè)操作數(shù)
- .*、::、sizeof、?:、. 這5個(gè)操作符無(wú)法進(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)算符重載必須有返回值,如果沒(méi)有返回值的話,無(wú)法解決 a = b = c 這種連續(xù)賦值的操作。
拷貝構(gòu)造函數(shù)與賦值運(yùn)算符重載
Date d1(1); Date d2(0); //賦值運(yùn)算符重載 d2 = d1; //注意,只有2個(gè)操作數(shù)都是已經(jīng)定義過(guò)的變量時(shí),才會(huì)調(diào)用賦值運(yùn)算符重載 //拷貝構(gòu)造函數(shù) Date d3(d1);
淺拷貝
淺拷貝是你在沒(méi)有寫拷貝構(gòu)造函數(shù)和operator=時(shí),編譯器自動(dòng)調(diào)用的默認(rèn)成員函數(shù)。它的功能是將對(duì)象以字節(jié)的為單位拷貝過(guò)去。
取地址與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語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲的兩種方法
猜數(shù)字小游戲是我們大多數(shù)人學(xué)習(xí)C語(yǔ)言時(shí)都會(huì)了解到的一個(gè)有趣的C語(yǔ)言小游戲,本文就詳細(xì)的介紹一下,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01C語(yǔ)言實(shí)現(xiàn)斐波那契數(shù)列(非遞歸)的實(shí)例講解
下面小編就為大家?guī)?lái)一篇C語(yǔ)言實(shí)現(xiàn)斐波那契數(shù)列(非遞歸)的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08基于Matlab實(shí)現(xiàn)人工神經(jīng)網(wǎng)絡(luò)(ANN)回歸的示例詳解
這篇文章主要為大家詳細(xì)介紹了Matlab實(shí)現(xiàn)人工神經(jīng)網(wǎng)絡(luò)(ANN)回歸的相關(guān)資料,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-02-02C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配詳解
這篇文章主要介紹了C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06