c 物件相關筆記

2021-09-11 00:17:03 字數 2783 閱讀 5332

跟函式有關,只能在函式中使用

前有個隱藏的this,this為乙個指標,為該物件的位址

沒有返回型別,與類的名稱一模一樣,當物件被創造時呼叫,可以有引數

沒有返回型別,與類的名稱一模一樣,當物件被結束時呼叫,區別為在函式前加"~",不可以有引數

c++結構體可以有建構函式,但有建構函式的時候,就不能用普通的c語言定義結構體方法給它賦初值,只能用建構函式

沒有引數的就叫預設建構函式,包括自己定義的沒有引數的建構函式

new運算子的返回值為位址,new時先給空間再初始化,delete是先析構,再收回空間

舉例:int * psome= new int [10]

此時使用delete psome 來表示刪除這連續10個int空間,不帶的話則表示只析構第乙個

但是,此時也刪除了這連續的10個空間,但是沒有析構其餘9個int,帶則析構了全部

##不要用delete去釋放不是new出來的空間(在分配的表中沒找到那一項)

##delete乙個空指標是安全的

private的作用域只在類內,注:同一類的物件可以相互訪問,只在編譯時檢查

protect的作用域為類及類的子孫

public的作用域為其餘函式都可以訪問

可以訪問其的private變數,只在編譯時候檢查

class沒有宣告訪問屬性,預設為private

struct預設為public

在建構函式前執行,推薦使用初始化列表初始化,不要在建構函式中賦初值,在建構函式初始化則意味著,它必須有預設值,因為在建構函式中賦初值,相當於已經賦初值了兩次,,構造後一次,初始化一次

成員變數初始化需要在這,父類的初始化也需要在這

同時順序是按宣告的順序開始執行的

最先為父類,再按類中宣告的成員變數順序開始初始化

拿其他物件拼裝出乙個類,在成員變數中有其他類的物件

拿已有的類,在已有的類上進行修改,從而有乙個新的類

構造時,先構造父類,再構造子類

析構時反過來

在子類定義乙個父類已有的方法,此時這個方法與父類無關(其他過載的不同引數的函式都不能用)

其他語言則為overwrite 為父類的替代品

介面是類的方法中public的部分,即對外公開的部分(個人理解)

建議不要使用

相當於把函式**搬到使用的地方,編譯時,並不產生這個函式的**

要在.h中宣告並定義

會增加程式**,空間換時間

比巨集定義要好,可以型別檢查

成員函式在類宣告時就給出body即為內聯函式

適用範圍:比較小,兩三行或者頻繁呼叫

不適用範圍:遞迴和非常大的函式不可以為內聯函式

const 在 * 之前,意思為不能通過該指標變數去修改值

const 在 * 之後,意思為不能修改該指標的值(即所指向的位址)

在函式後面寫了const 意味著this是const

當dll/lib中已經實現標頭檔案中的函式,類時,只引用h就可以了,否則h和cpp都得引入工程(暫時理解,以後繼續補充)

變數的別名。

定義規則:型別& 變數名= 原變數

若在引用前+const 則不能用引用去改變原變數的值

特點:1.不能是null

2.必須依靠乙個變數,是變數的別名

3.不能更改為新的變數的別名

4.不能將其他引用作為右值

5.實際為const 指標

把子類當成父類使用

虛函式有虛函式的模擬普通類大,一般為乙個int型變數大小(位址)

該變數(vttr)指向乙個表(vtable),該錶存放著該類的虛函式的位址,所有該類的物件的表的位址相同(一般為該物件的第乙個int大小範圍)

如果類中有乙個virtual函式,那麼析構函式應為virtual函式

1.不用改變那個物件

2.通過傳遞位址而不是傳遞變數本身

3.防止其被改變

也可以用等號+某個值,不用圓括弧

類中的成員變數的拷貝,全部複製,指標也會被拷貝,位址相同,引用也會被拷貝,指向同乙個變數

新增加乙個建構函式,引數為const 本身物件&

就可以自己控制拷貝時的細節

如果不+const和&,會陷入死迴圈,在傳參時會發生一次拷貝構造,拷貝時又發生,迴圈反覆

1.預設建構函式 2.虛建構函式 3.拷貝建構函式

1.持久儲存(不依賴某個物件而存在)

2.訪問性受侷限(隱藏)

static free function – 過時

static global variables – 過時

static local variables – 持久儲存

static member variables – 被所有例項共享

static member function – 被所有例項共享,且只能接受static變數

靜態的成員變數要找個cpp去放這個變數,不然只是在類中宣告,而不是定義

靜態的成員函式不能有非static變數的原因是因為它沒有this

全域性變數的建構函式在main之前,析構函式在main函式結束時或者呼叫了exit()

全域性變數初始化順序是無序的

this為其第乙個引數

第乙個const作用為防止其為左值

第二個const表示引數不會被修改

第三個const表示this不會被修改

雙目一般作為非成員,單目部分(=,(),,->,->*)一定要作為成員

是乙個宣告,使用函式時會先檢查是否有匹配的函式,再檢查是否有匹配的函式模板

建構函式中拋異常,不會呼叫析構函式,也得不到這個物件,但是記憶體已經分配

如果兩個函式引數相同,返回型別不同是不能過載的

js 物件導向相關筆記(五)

1.作用域 起作用的範圍 塊兒級作用域 ecmascript6之前js中沒有塊兒級作用域 詞法作用域 就是在 寫好的一刻,變數的作用域就已經確定了,這種作用域,就是所謂的詞法作用域,和詞法作用域相對的叫動態作用域,js中的詞法作用域不是動態作用域 ecmascript6之前js中唯一能夠產生作用域的...

C 物件模型筆記 一 C 物件

c 支援了資料和方法的聯絡。對 c 來說,他的布局成本就是 1.none static data member 2.a pointer to virtue table 3.the pointer to virtue class 而成員函式,並不包括在 c 物件裡。還而言之,每乙個非 inline 成...

c 物件導向筆記

繼承形式如下 class derived class access specifier base class當乙個類派生自基類,該基類可以被繼承為 public protected 或 private 幾種型別。繼承型別是通過上面講解的訪問修飾符 access specifier 來指定的。我們幾乎...