教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

C++易犯錯(cuò)知識(shí)點(diǎn)(二)

更新時(shí)間:2018年01月23日17時(shí)19分 來(lái)源:傳智播客 瀏覽次數(shù):

16、要想共享初始化的過(guò)程,可以先定義一個(gè)共享成員函數(shù),然后每個(gè)構(gòu)造函數(shù)都調(diào)用之。

17、C++提供的默認(rèn)構(gòu)造函數(shù)是個(gè)無(wú)參構(gòu)造函數(shù),它僅負(fù)責(zé)創(chuàng)建對(duì)象,而不做任何初始化工作。只要一個(gè)類(lèi)定義了一個(gè)構(gòu)造函數(shù),C++就不再提供默認(rèn)的構(gòu)造函數(shù)。(如果此時(shí)還想要無(wú)參構(gòu)造函數(shù),則需要自己定義)與變量定義類(lèi)似,在用默認(rèn)構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),如果創(chuàng)建的是全局對(duì)象或靜態(tài)對(duì)象,則對(duì)象的位模式全為0,否則對(duì)象值是隨機(jī)的。

創(chuàng)建對(duì)象的唯一途徑是調(diào)用構(gòu)造函數(shù)。

靜態(tài)對(duì)象只被構(gòu)造一次,所有全局對(duì)象都在主函數(shù)main()之前被構(gòu)造。

18、面向?qū)ο蟪绦蛟O(shè)計(jì)主要是兩方面:面向?qū)ο髴?yīng)用程序設(shè)計(jì),類(lèi)庫(kù)的設(shè)計(jì)。面向?qū)ο蟪绦蛟O(shè)計(jì)的關(guān)鍵是如何抽象和分類(lèi)。

19、全局變量、靜態(tài)變量、常量存放在全局?jǐn)?shù)據(jù)區(qū),所有類(lèi)成員函數(shù)和非類(lèi)成員函數(shù)代碼存放在代碼區(qū),為運(yùn)行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回?cái)?shù)據(jù)、返回地址等存放在棧區(qū),余下的空間都被作為堆區(qū)。

void* malloc(size_t);和void free(void*);在頭文件malloc.h中聲明。而操作符new和delete是C++的一部分,無(wú)須包含頭文件,它們都是從堆中分配和釋放內(nèi)存塊,但是具體操作上兩者有很大的區(qū)別。

操作堆內(nèi)存時(shí),如果分配了內(nèi)存,就有責(zé)任回收它,否則運(yùn)行的程序?qū)?huì)造成內(nèi)存泄露,這與函數(shù)中棧區(qū)分配局部變量有本質(zhì)的區(qū)別。

從C++來(lái)說(shuō),不使用malloc()函數(shù)一個(gè)原因是,它在分配空間的時(shí)候不能調(diào)用構(gòu)造函數(shù)。類(lèi)對(duì)象的建立是分配空間,構(gòu)造結(jié)構(gòu)及初始化的三位一體,它們統(tǒng)一由構(gòu)造函數(shù)來(lái)完成。而new和delete在創(chuàng)建對(duì)象和刪除對(duì)象時(shí),便同時(shí)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)。

定義對(duì)象數(shù)組,在生成對(duì)象時(shí),依次調(diào)用構(gòu)造函數(shù)(如依次生成ps[0],ps[1],ps[2]......),由于分配數(shù)組時(shí),new的格式是類(lèi)型后面跟[元素個(gè)數(shù)](student* ps=new student[10]),不能再跟構(gòu)造函數(shù)參數(shù),所以從堆上分配對(duì)象數(shù)組,只能調(diào)用默認(rèn)的構(gòu)造函數(shù),不能調(diào)用其它任何構(gòu)造函數(shù),如果該類(lèi)沒(méi)有默認(rèn)的構(gòu)造函數(shù),則分配對(duì)象數(shù)組失敗。Delete[] ps告訴C++將要該指針指向的是一個(gè)數(shù)組,如果在[]中填上了長(zhǎng)度信息,C++將忽略。

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

當(dāng)構(gòu)造函數(shù)的參數(shù)為自身類(lèi)的引用時(shí),這個(gè)構(gòu)造函數(shù)稱(chēng)為拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)的功能是用一個(gè)已有對(duì)象初始化一個(gè)正在建立的同類(lèi)對(duì)象。

拷貝構(gòu)造函數(shù)定義形式如下:

Student(student& s)

27、C++基礎(chǔ)筆記(一) - EdwardLewis - 墨涵天地

Person p1;

p2=p1;

27、C++基礎(chǔ)筆記(一) - EdwardLewis - 墨涵天地

27、C++基礎(chǔ)筆記(一) - EdwardLewis - 墨涵天地

在創(chuàng)建對(duì)象p2時(shí),對(duì)象p1被復(fù)制給了p2,同時(shí)資源也作了復(fù)制,此時(shí)p1和p2指向不同的資源,這稱(chēng)為深拷貝。

27、C++基礎(chǔ)筆記(一) - EdwardLewis - 墨涵天地

如果你的類(lèi)需要析構(gòu)函數(shù)來(lái)析構(gòu)資源,則它也需要一個(gè)拷貝構(gòu)造函數(shù)。C++提供的默認(rèn)函數(shù)只是對(duì)對(duì)象進(jìn)行淺拷貝復(fù)制。如果對(duì)象的數(shù)據(jù)成員包括指向堆空間的指針,就不能使用這種拷貝方式,要自己定義拷貝構(gòu)造函數(shù),為創(chuàng)建的對(duì)象分配堆空間。

21、靜態(tài)成員

這種屬于類(lèi)的一部分,但既不適用于普通成員函數(shù),也不適用于全局變量表示的數(shù)據(jù),我們用靜態(tài)成員來(lái)表示。

一般情況下,我們?cè)陬?lèi)的內(nèi)部實(shí)現(xiàn)中對(duì)靜態(tài)數(shù)據(jù)成員進(jìn)行定義(在類(lèi)的內(nèi)部實(shí)現(xiàn)中分配空間和初始化)。

Int student::noOfstudent=0;

靜態(tài)數(shù)據(jù)成員一般用于:

標(biāo)志一個(gè)事件的發(fā)生與否,某個(gè)特定的指針,變化的對(duì)象等。

靜態(tài)成員函數(shù)定義是類(lèi)的內(nèi)部實(shí)現(xiàn),屬于類(lèi)的一部分,定義位置同一般成員函數(shù)。與靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)與類(lèi)相聯(lián)系,不與類(lèi)的對(duì)象相聯(lián)系,所以訪(fǎng)問(wèn)靜態(tài)成員函數(shù)時(shí),不需要對(duì)象。如果用對(duì)象去引用靜態(tài)成員函數(shù),只是用其類(lèi)型。

#include

using namespace std;

class Student

{

public:

static int number()

{

return noOfStudents;

}

protected:

char name[40];

static int noOfStudents;

};

int Student::noOfStudents=1;

int main()

{

Student s;

cout<

cout<

return 1;

}

一個(gè)靜態(tài)成員函數(shù)不與任何對(duì)象相聯(lián)系,故不能對(duì)非靜態(tài)成員進(jìn)行默認(rèn)訪(fǎng)問(wèn)。靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的根本區(qū)別是靜態(tài)成員函數(shù)沒(méi)有this指針。 這也就是靜態(tài)成員函數(shù)與當(dāng)前對(duì)象無(wú)聯(lián)系的原因。

*********************************

class Sc

{

public:

void nsfn(int a);//類(lèi)同聲明成Sc::nsfn(Sc* this,int a)

static void sfn(int a); //無(wú)this指針

//...

};

void f(Sc& s)

{

s.nsfn(10); //C++編譯成Sc::nsfn(&s,10)

s.sfn(10); //C++編譯成Sc::sfn(10)

}

靜態(tài)的static一詞與靜態(tài)存儲(chǔ)類(lèi)的static是兩個(gè)概念,一個(gè)論及類(lèi),一個(gè)論及內(nèi)存空間的位置及作用域,所限定以要區(qū)分靜態(tài)對(duì)象和靜態(tài)成員。

本文版權(quán)歸傳智播客C/C++學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客C/C++學(xué)院
首發(fā):http://oisangadgets.com/c/
0 分享到:
和我們?cè)诰€(xiàn)交談!