首頁技術(shù)文章正文

C++易犯錯知識點(diǎn)(二)

更新時間:2018-01-23 來源:黑馬程序員 瀏覽量:

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

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

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

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

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

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

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

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

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

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

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

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

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

Student(student& s)

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

Person p1;

p2=p1;

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

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

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

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

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

21、靜態(tài)成員

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

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

Int student::noOfstudent=0;

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

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

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

#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<<s.number()<<endl;< p="">

cout<<student::number()<<endl;< p="">

return 1;

}

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

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

class Sc

{

public:

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

static void sfn(int a); //無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)存儲類的static是兩個概念,一個論及類,一個論及內(nèi)存空間的位置及作用域,所限定以要區(qū)分靜態(tài)對象和靜態(tài)成員。


本文版權(quán)歸黑馬程序員C/C++學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!


作者:黑馬程序員C/C++培訓(xùn)學(xué)院


首發(fā):http://c.itheima.com/


分享到:
在線咨詢 我要報名
和我們在線交談!