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

全國咨詢/投訴熱線:400-618-4000

C++易犯錯知識點(二)

更新時間:2018年01月23日17時19分 來源:傳智播客 瀏覽次數:

16、要想共享初始化的過程,可以先定義一個共享成員函數,然后每個構造函數都調用之。

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

創建對象的唯一途徑是調用構造函數。

靜態對象只被構造一次,所有全局對象都在主函數main()之前被構造。

18、面向對象程序設計主要是兩方面:面向對象應用程序設計,類庫的設計。面向對象程序設計的關鍵是如何抽象和分類。

19、全局變量、靜態變量、常量存放在全局數據區,所有類成員函數和非類成員函數代碼存放在代碼區,為運行函數而分配的局部變量、函數參數、返回數據、返回地址等存放在棧區,余下的空間都被作為堆區。

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

操作堆內存時,如果分配了內存,就有責任回收它,否則運行的程序將會造成內存泄露,這與函數中棧區分配局部變量有本質的區別。

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

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

20、拷貝構造函數

當構造函數的參數為自身類的引用時,這個構造函數稱為拷貝構造函數。拷貝構造函數的功能是用一個已有對象初始化一個正在建立的同類對象。

拷貝構造函數定義形式如下:

Student(student& s)

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

Person p1;

p2=p1;

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

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

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

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

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

21、靜態成員

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

一般情況下,我們在類的內部實現中對靜態數據成員進行定義(在類的內部實現中分配空間和初始化)。

Int student::noOfstudent=0;

靜態數據成員一般用于:

標志一個事件的發生與否,某個特定的指針,變化的對象等。

靜態成員函數定義是類的內部實現,屬于類的一部分,定義位置同一般成員函數。與靜態數據成員一樣,靜態成員函數與類相聯系,不與類的對象相聯系,所以訪問靜態成員函數時,不需要對象。如果用對象去引用靜態成員函數,只是用其類型。

#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;

}

一個靜態成員函數不與任何對象相聯系,故不能對非靜態成員進行默認訪問。靜態成員函數與非靜態成員函數的根本區別是靜態成員函數沒有this指針。 這也就是靜態成員函數與當前對象無聯系的原因。

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

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)

}

靜態的static一詞與靜態存儲類的static是兩個概念,一個論及類,一個論及內存空間的位置及作用域,所限定以要區分靜態對象和靜態成員。

本文版權歸傳智播客C/C++學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客C/C++學院
首發:http://www.itcast.cn/c/
红豆直播app黄台_红豆直播app下载免费_红豆直播app下载