C++中的四個(gè)默認(rèn)成員函數(shù)與運(yùn)算符重載詳解
本文主要給大家介紹了關(guān)于C++默認(rèn)成員函數(shù)與運(yùn)算符重載的相關(guān)內(nèi)容,分享出來(lái)公的敬愛(ài)啊參考學(xué)習(xí),話不多說(shuō),來(lái)一起看看詳細(xì)的介紹:
一:類(lèi)和對(duì)象的基礎(chǔ)知識(shí):類(lèi)的定義,訪問(wèn)限定符,面向?qū)ο蠓庋b性,對(duì)象的大小計(jì)算等等。(編譯環(huán)境為VS2015)
面向?qū)ο蟪绦蛟O(shè)計(jì):
概念:(Object Oriented Programming,縮寫(xiě):OOP)是一種程序設(shè)計(jì)范型,同時(shí)也是一種程序開(kāi)發(fā)的方法。對(duì)象指的是類(lèi)的實(shí)例,將對(duì)象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴(kuò)展性。
類(lèi):類(lèi)的基本思想是數(shù)據(jù)抽象和封裝。類(lèi)的接口包括用戶所能執(zhí)行的操作;類(lèi)的實(shí)現(xiàn)則包括類(lèi)的數(shù)據(jù)成員、負(fù)責(zé)接口實(shí)現(xiàn)的函數(shù)體以及定義類(lèi)所需的各種私有函數(shù)。要想實(shí)現(xiàn)數(shù)據(jù)抽線和封裝,就得先定義一個(gè)抽象數(shù)據(jù)類(lèi)型。
訪問(wèn)限定符:1.public(公有屬性);2.private(私有屬性,默認(rèn)情況下就為此屬性);3.protect(保護(hù))
注:
1. public成員可從類(lèi)外部直接訪問(wèn),private/protected成員不能從類(lèi)外部直接訪問(wèn);
2. 每個(gè)限定符在類(lèi)體中可使用多次,它的作用域是從該限定符出現(xiàn)開(kāi)始到下一個(gè)限定符之前或類(lèi)體結(jié)束前。
3. 類(lèi)體中如果沒(méi)有定義限定符,則默認(rèn)為私有的。
4. 類(lèi)的訪問(wèn)限定符體現(xiàn)了面向?qū)ο蟮姆庋b性。
例:定義一個(gè)日期類(lèi)
公有的成員函數(shù)可以在類(lèi)內(nèi)聲明類(lèi)外定義,也可以在類(lèi)內(nèi)直接定義:
class Date { public: void Display(); //類(lèi)內(nèi)聲明 private: int _year; int _month; int _day; }; void Date::Display() //類(lèi)外定義 { cout << _year << "-" << _month << "-" << _day << endl; }
如何實(shí)例化一個(gè)對(duì)象?
class Date { public: void Display(); public: int _year; int _month; int _day; }; int main() { Date d1; d1._year = 2017; d1._month = 7; d1._day = 4; //Date d1; //Date *date = &d1; //date->_year = 2017; //date->_month = 7; //date->_day = 4; system("pause"); return 0; }
1.類(lèi)只是一個(gè)模型一樣的東西,限定了類(lèi)有哪些成員,定義出一個(gè)類(lèi)并沒(méi)有分配實(shí)際的內(nèi)存空間來(lái)存儲(chǔ)它。
2.一個(gè)類(lèi)可以實(shí)例化出多個(gè)對(duì)象,實(shí)例化出的對(duì)象占用實(shí)際的物理空間存儲(chǔ)類(lèi)成員變量。
一個(gè)空類(lèi)的大小是幾?
如果我們sizeof(Date),出來(lái)的結(jié)果是12;但是如果這個(gè)類(lèi)是空類(lèi)呢?結(jié)果是多少?
class AA {}; int main() { int sz = sizeof(AA); cout << sz << endl; system("pause"); return 0; }
輸出結(jié)果是1!
原因是編譯器給空類(lèi)分配了一個(gè)字節(jié)的大小用來(lái)占位。
注:結(jié)構(gòu)體內(nèi)存對(duì)其規(guī)則:
1.第一個(gè)成員在與結(jié)構(gòu)體變量偏移量為0的地址處。
2.其他成員變量要對(duì)齊到某個(gè)數(shù)字(對(duì)齊數(shù))的整數(shù)倍的地址處。
//對(duì)齊數(shù) = 編譯器默認(rèn)的一個(gè)對(duì)齊數(shù) 與 該成員大小的較小值。
VS中默認(rèn)的值為8
gcc中的默認(rèn)值為4
3.結(jié)構(gòu)體總大小為最大對(duì)齊數(shù)(每個(gè)成員變量除了第一個(gè)成員都有一個(gè)對(duì)齊數(shù))的整數(shù)倍。
4.如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對(duì)齊到自己的最大對(duì)齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整體大小就是所有最大對(duì)齊數(shù)(含嵌套結(jié)構(gòu)體的對(duì)齊數(shù))的整數(shù)倍。
2:類(lèi)的四個(gè)默認(rèn)成員函數(shù)及運(yùn)算符重載相關(guān)知識(shí)
構(gòu)造函數(shù):
成員變量為私有的,要對(duì)它們進(jìn)行初始化,必須用一個(gè)公有成員函數(shù)來(lái)進(jìn)行。同時(shí)這個(gè)函數(shù)應(yīng)該有且僅在定義對(duì)象時(shí)自動(dòng)執(zhí)行一次,這時(shí)調(diào)用的函數(shù)稱為構(gòu)造函數(shù)(constructor) 。
構(gòu)造函數(shù)是特殊的成員函數(shù),其特征如下:
1. 函數(shù)名與類(lèi)名相同。
2. 無(wú)返回值。
3. 對(duì)象構(gòu)造(對(duì)象實(shí)例化)時(shí)系統(tǒng)自動(dòng)調(diào)用對(duì)應(yīng)的構(gòu)造函數(shù)。
4. 構(gòu)造函數(shù)可以重載。
5. 構(gòu)造函數(shù)可以在類(lèi)中定義,也可以在類(lèi)外定義。
6. 如果類(lèi)定義中沒(méi)有給出構(gòu)造函數(shù),則C++編譯器自動(dòng)產(chǎn)生一個(gè)缺省的構(gòu)造函數(shù),但只要我們定義了一個(gè)構(gòu)造函數(shù),系統(tǒng)就不會(huì)自動(dòng)生成缺省的構(gòu)造函數(shù)。
7. 無(wú)參的構(gòu)造函數(shù)和全缺省值的構(gòu)造函數(shù)都認(rèn)為是缺省構(gòu)造函數(shù),并且缺省的構(gòu)造函數(shù)只能有一個(gè)。
例:我們平時(shí)最常用的就是全缺省值的構(gòu)造函數(shù),定義方式如下:
Date(int year = 1900, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } //在main函數(shù)中按照下面方式進(jìn)行初始化 //若不進(jìn)行賦值,則采用缺省值為1900-1-1 Date d1(2017, 7, 6)
析構(gòu)函數(shù):
當(dāng)一個(gè)對(duì)象的生命周期結(jié)束時(shí),C++編譯系統(tǒng)會(huì)自動(dòng)調(diào)用一個(gè)成員函數(shù),這個(gè)特殊的成員函數(shù)即析構(gòu)函數(shù)(destructor)
其特征如下:
1. 析構(gòu)函數(shù)在類(lèi)名加上字符~。
2. 析構(gòu)函數(shù)無(wú)參數(shù)無(wú)返回值。
3. 一個(gè)類(lèi)有且只有一個(gè)析構(gòu)函數(shù)。若未顯示定義,系統(tǒng)會(huì)自動(dòng)生成缺省的析構(gòu)函數(shù)。
4. 對(duì)象生命周期結(jié)束時(shí),C++編譯系統(tǒng)系統(tǒng)自動(dòng)調(diào)用析構(gòu)函數(shù)。
5. 注意析構(gòu)函數(shù)體內(nèi)并不是刪除對(duì)象,而是做一些清理工作。
就好比下面這個(gè)例子,構(gòu)造函數(shù)開(kāi)辟了size個(gè)int類(lèi)型大小的空間,在程序結(jié)束時(shí)我們就應(yīng)該釋放掉該內(nèi)存空間,避免發(fā)生內(nèi)存泄漏:
class Array { public: Array(int size) { _ptr = new int[size]; } ~Array() { if (_ptr) { delete[] _ptr; } } private: int* _ptr; };
拷貝構(gòu)造
創(chuàng)建對(duì)象時(shí)使用同類(lèi)對(duì)象來(lái)進(jìn)行初始化,這時(shí)所用的構(gòu)造函數(shù)稱為拷貝構(gòu)造函數(shù)(Copy Constructor),拷貝構(gòu)造函數(shù)是特殊的構(gòu)造函數(shù)。
例:
Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } //Date d1(2017, 7, 4); // 下面兩種用法都是調(diào)用拷貝構(gòu)造函數(shù),是等價(jià)的。 //Date d2(d1); //Date d2 = d1;
特征
1. 拷貝構(gòu)造函數(shù)其實(shí)是一個(gè)構(gòu)造函數(shù)的重載。
2. 拷貝構(gòu)造函數(shù)的參數(shù)必須使用引用傳參,使用傳值方式會(huì)引發(fā)無(wú)窮遞歸調(diào)用。
3. 若未顯示定義,系統(tǒng)會(huì)默認(rèn)缺省的拷貝構(gòu)造函數(shù)。缺省的拷貝構(gòu)造函數(shù)會(huì),依次拷貝類(lèi)成員進(jìn)行初始化。
賦值運(yùn)算符重載
拷貝構(gòu)造函數(shù)是創(chuàng)建的對(duì)象,使用一個(gè)已有對(duì)象來(lái)初始化這個(gè)準(zhǔn)備創(chuàng)建的對(duì)象。賦值運(yùn)算符的重載是對(duì)一個(gè)已存在的對(duì)象進(jìn)行拷貝賦值。
5個(gè)C++不能重載的運(yùn)算符: .*/::/sizeof/?:/.
Date& operator = (const Date& d) { if (this != &d)//防止重復(fù)賦值 { this->_year = d._year; this->_month = d._month; this->_day = d._day; } return *this; } void Test() { Date d1(2017, 7, 4); //拷貝構(gòu)造 Date d2(d1); //賦值運(yùn)算符重載 Date d3; d3 = d1; }
3:關(guān)于隱含的this指針以及對(duì)運(yùn)算符重載背后做的事情。
隱含的this指針
1. 每個(gè)成員函數(shù)都有一個(gè)指針形參,它的名字是固定的,稱為this指針,this指針是隱式的。(構(gòu)造函數(shù)比較特殊,沒(méi)有這個(gè)隱含this形參)
2. 編譯器會(huì)對(duì)成員函數(shù)進(jìn)行處理,在對(duì)象調(diào)用成員函數(shù)時(shí),對(duì)象地址作實(shí)參傳遞給成員函數(shù)的第一個(gè)形參this指針。
3. this指針是成員函數(shù)隱含指針形參,是編譯器自己處理的,我們不能在成員函數(shù)的形參中添加this指針的參數(shù)定義,也不能在調(diào)用時(shí)顯示傳遞對(duì)象的地址給this指針。
例一:在拷貝構(gòu)造函數(shù)中this所做的事情
例二:在運(yùn)算符重載中this做的事情
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)我們的支持。
上一篇:c++中深淺拷貝以及寫(xiě)時(shí)拷貝的實(shí)現(xiàn)示例代碼
欄 目:C語(yǔ)言
本文標(biāo)題:C++中的四個(gè)默認(rèn)成員函數(shù)與運(yùn)算符重載詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1289.html
您可能感興趣的文章
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 01-10深入理解C++中常見(jiàn)的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類(lèi)算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10delphi制作wav文件的方法