C 學習筆記(3) 封裝

2021-10-10 00:27:01 字數 3935 閱讀 3581

封裝是c++物件導向三大特性之一

封裝的意義(1)

封裝的意義(2)

類在設計時,可以把屬性和行為放在不同的許可權下,加以控制。

在c++中,共有三種許可權:

公共許可權 public : 類內可以訪問 類外可以訪問

保護許可權 protected: 類內可以訪問 類外不可以訪問

私有許可權 private: 類內可以訪問 類外不可以訪問

優點1:將所有成員屬性設定為私有,可以自己控制讀寫許可權

優點2:對於寫許可權,我們可以檢測資料的有效性

物件的初始化和清理是兩個非常重要的安全問題。乙個物件或者變數沒有初始狀態,對其使用後果是未知。同樣的使用完乙個物件或變數,沒有及時清理,也會造成一定的安全問題

c++利用了建構函式析構函式解決上述問題,這兩個函式將會被編譯器自動呼叫,完成物件初始化和清理工作。

物件的初始化和清理工作是編譯器強制要我們做的事情,因此如果我們不提供構造和析構,編譯器會提供

編譯器提供的建構函式和析構函式是空實現。

建構函式語法:類名(){}

建構函式,沒有返回值也不寫void

函式名稱與類名相同

建構函式可以有引數,因此可以發生過載

程式在呼叫物件時候會自動呼叫構造,無須手動呼叫,而且只會呼叫一次

析構函式語法:~類名(){}

析構函式,沒有返回值也不寫void

函式名稱與類名相同,在名稱前加上符號 ~

析構函式不可以有引數,因此不可以發生過載

程式在物件銷毀前會自動呼叫析構,無須手動呼叫,而且只會呼叫一次

3.1 建構函式的分類及呼叫

兩種分類方式:

​ 按引數分為: 有參構造和無參構造

​ 按型別分為: 普通構造和拷貝構造

三種呼叫方式:

括號法

顯示法

隱式轉換法

利用有參建構函式,括號法初始化物件屬性:

#include

#include

using

namespace std;

class

student

student

(int age)

student

(const student & tmp)

~student()

public

:int age;};

void

test1()

intmain()

利用有參建構函式,顯示法初始化物件屬性:

#include

#include

using

namespace std;

class

student

student

(int age)

student

(const student & tmp)

~student()

public

:int age;};

void

test1()

intmain()

利用有參建構函式,隱式轉換法初始化物件屬性:

#include

#include

using

namespace std;

class

student

student

(int age)

student

(const student & tmp)

~student()

public

:int age;};

void

test1()

intmain()

利用拷貝建構函式,顯示法初始化物件屬性:

#include

#include

using

namespace std;

class

student

student

(int age)

student

(const student & tmp)

~student()

public

:int age;};

void

test1()

intmain()

顯示結果為:

其中,建立了兩個物件,首先呼叫了一次有參建構函式,進行初始化,再利用拷貝函式對laowang這個物件進行初始化。

3.2 構造函式呼叫規則

預設情況下,c++編譯器至少給乙個類新增3個函式

預設建構函式(無參,函式體為空)

預設析構函式(無參,函式體為空)

預設拷貝建構函式,對屬性進行值拷貝(也叫淺拷貝

構造函式呼叫規則如下:

3.2 深拷貝與淺拷貝

淺拷貝:簡單的賦值拷貝操作,包括預設拷貝建構函式

深拷貝:在堆區重新申請空間,進行拷貝操作

#include

#include

using

namespace std;

class

student

student

(const student & tmp)

~student()

cout <<

"析構函式釋放堆中的指標資料"

<< endl;

}//student()

public

:int age;

int* height;};

intmain()

}

上述**沒有語法錯誤,但是在執行時會出現異常錯誤。這是因為由於淺拷貝在設計指標時產生了堆區記憶體重複釋放的問題,如下圖所示:

解決辦法:利用深拷貝,在堆中利用new再開闢乙個記憶體區域,如下圖:

**如下:

#include

#include

using

namespace std;

class

student

student

(const student & tmp)

~student()

cout <<

"析構函式釋放堆中的指標資料"

<< endl;

}//student()

public

:int age;

int* height;};

intmain()

C 學習筆記(九) 封裝

c 物件導向的三個特性 封裝 繼承和多型。意義 將屬性和行為作為乙個整體,表現生活中的整體。將屬性和行為加以許可權控制。屬性 用資料描述 行為 用函式描述 許可權 public 公共許可權 類內可以訪問,類外也可以訪問。protected 保護許可權 類內可以訪問,類外不可以訪問。兒子可以訪問父親的...

C 學習(8) 封裝

c 物件導向的三大特性 封裝 繼承 多型 c 認為萬事萬物都可以為物件,物件上有其屬性和行為 具有相同性質的物件,可以抽象為類 封裝是c 物件導向三大特性之一 封裝的意義 封裝意義一 在設計類的時候,屬性和行為寫在一起,表現事物 語法 class 類名 示例1 設計乙個圓類,求圓的周長 includ...

C 學習筆記(5) 封裝 繼承 多型

封裝 每個物件都能包含它能進行操作所需要的所有資訊,這個特性稱為封裝,因此物件不必依賴其他物件來完成自己的操作。封裝的好處 l 良好的封裝能夠減少耦合。l 類內部的實現可以自由地修改。l 類具有清晰的對外介面。繼承 物件的繼承代表了一種 is a 的關係,如果兩個物件a和b,可以描述為 b是a 則表...