Week2(Boolan)

不帶指針的字符串

編譯器有默認(rèn)的拷貝構(gòu)造和拷貝賦值函數(shù),以位為單位。但在class without pointer members的設(shè)計(jì)中如果使用默認(rèn)版本,拷貝的只是指針,則兩個(gè)指針指向同一個(gè)內(nèi)容(alias),并沒有新的對(duì)象被創(chuàng)建,而目的側(cè)指針本來指向的內(nèi)存就會(huì)泄露。

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

檢查傳進(jìn)的字符串是否為空,構(gòu)造函數(shù)前不能加const

三個(gè)特殊函數(shù)

1.拷貝構(gòu)造copy ctor(變量先前不存在):接收的參數(shù)為同樣類型的對(duì)象

2.拷貝賦值copy assignment op

檢測自我賦值 if (this == &str) return *this; //效率高,避免錯(cuò)誤(已經(jīng)刪除了this pointer所指的內(nèi)容,無法進(jìn)行下一步分配出和自身同等大小的空間)

先將左側(cè)清空,再分配出和右側(cè)同樣大的空間,最后將右側(cè)拷貝到左側(cè)

3.析構(gòu)函數(shù):當(dāng)創(chuàng)建的類對(duì)象死亡前(離開作用域),析構(gòu)函數(shù)就會(huì)被調(diào)用,刪除先前動(dòng)態(tài)分配的內(nèi)存

字符串長度的設(shè)計(jì)

1.在字符串結(jié)尾添加結(jié)束符號(hào)‘0’(如c/c++)

2.在字符串前添加表示長度的量(pascal)

<<操作符的重載:不能寫為成員函數(shù),成員函數(shù)都有隱含*this參數(shù),輸出時(shí)就得寫成"s1<<cout"的形式,不符合習(xí)慣。配合輔助函數(shù)獲取cout可以識(shí)別的指針輸出


堆(system heap):可在程序的任何地方new一塊由操作系統(tǒng)提供的全局的內(nèi)存空間。在變量前加上static關(guān)鍵字或者在函數(shù)外聲明的變量(global object),作用域?yàn)檎麄€(gè)程序

new對(duì)編譯器來說的過程(三個(gè)動(dòng)作):編譯器轉(zhuǎn)化為operator? new函數(shù),再轉(zhuǎn)化為malloc函數(shù) ,再類型轉(zhuǎn)換,最后pointer->Complex::Complex(1,2)即Complex::Complex(pointer,1,2)意思是pointer調(diào)用了此構(gòu)造函數(shù),并且pointer為動(dòng)態(tài)分配的內(nèi)存的起始地址

delete對(duì)編譯器來說的過程(兩個(gè)動(dòng)作):先調(diào)用析構(gòu)函數(shù)將動(dòng)態(tài)分配的內(nèi)存刪掉,再調(diào)用operator delete函數(shù)調(diào)用free()將字符串本身(即指針)刪除

動(dòng)態(tài)分配所得的內(nèi)存塊:cookie(記錄整塊小,以便malloc分配和free回收)+調(diào)試模式下加上的+請(qǐng)求的空間大小+pad(補(bǔ)丁,可選,因?yàn)閂C環(huán)境下大小必須為16的倍數(shù)),對(duì)程序而言獲得內(nèi)存所以拿出地址最后一位標(biāo)記為1

動(dòng)態(tài)分配所得的數(shù)組:array new必須搭配array delete:若delete沒有[],雖然整個(gè)數(shù)組所占空間(n*指針大小,一般一個(gè)指針為4byte)被刪除了(由cookie來提示),但只有數(shù)組內(nèi)第一個(gè)指針指向的空間被釋放,因?yàn)闆]有[]提示編譯器,所以析構(gòu)函數(shù)只被調(diào)用了一次,就會(huì)發(fā)生內(nèi)存泄漏

棧(stack):存在于作用域(scope)內(nèi)的一塊內(nèi)存空間,用于存放函數(shù)的參數(shù)和返回地址。在函數(shù)內(nèi)聲明的變量(auto/local object,在函數(shù)調(diào)用完成后,被自動(dòng)清理,即析構(gòu)函數(shù)被自動(dòng)調(diào)用)所使用的內(nèi)存塊都取自此stack

靜態(tài)static:在函數(shù)(沒有this pointer,只能處理靜態(tài)數(shù)據(jù))或數(shù)據(jù)前加,脫離對(duì)象,通過類名或?qū)ο笳{(diào)用靜態(tài)函數(shù),類外需定義,在函數(shù)里聲明的靜態(tài)變量只在被第一次調(diào)用時(shí)創(chuàng)建,此后一直存在直到程序結(jié)束。


類模板class template

函數(shù)模板function template:template<typename T> 有argument deduction參數(shù)推導(dǎo),為C++中的算法

命名空間namespace:1.using namespace std 2.using std::cout


小插曲

一開始把Rectangle當(dāng)成了三角形,還想了半天怎么把三角形和作業(yè)里已經(jīng)聲明的width、height、點(diǎn)Point(x,y)變量聯(lián)系起來,還去查了查三角形的存在定理。。。(我的英語和數(shù)學(xué)真是白學(xué)了,一點(diǎn)腦子都不動(dòng),事事想當(dāng)然)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 讓自己習(xí)慣C++ 條款01:視C++為一個(gè)語言聯(lián)邦 為了更好的理解C++,我們將C++分解為四個(gè)主要次語言:...
    Mr希靈閱讀 2,993評(píng)論 0 13
  • Week2 Notes A.三大函數(shù):拷貝構(gòu)造,拷貝賦值,析構(gòu) string class這個(gè)不是標(biāo)準(zhǔn)庫里的stri...
    古來征戰(zhàn)幾人回閱讀 217評(píng)論 0 0
  • 一、類可以分為帶指針的與不帶指針的兩種形式,上周已經(jīng)回顧不帶指針的類的寫法。 對(duì)于帶指針的類,除了考慮其一般的構(gòu)造...
    林穿風(fēng)閱讀 216評(píng)論 0 0
  • 307、setValue:forKey和setObject:forKey的區(qū)別是什么? 答:1, setObjec...
    AlanGe閱讀 1,717評(píng)論 0 1
  • 踏著清新的露珠 呼吸著秋的濃濃氣息 詩意的季節(jié)向我們say Hello 期待已久的秋游活動(dòng)終于來了 可愛的天使們!...
    Super_Tyy閱讀 4,391評(píng)論 0 2

友情鏈接更多精彩內(nèi)容