不帶指針的字符串
編譯器有默認(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)然)