6 類與物件

2021-08-21 18:48:25 字數 3236 閱讀 9615

目錄

類宣告公有、私有、保護成員

資料抽象和封裝

內聯成員函式

成員函式的過載及其預設引數

類與結構體

隱含的this指標

類作用域

前向宣告

巢狀類區域性類

//類是一種使用者自定義型別,宣告形式:

class 類名稱

;

在關鍵字

public

後面宣告,它們是類與外部的介面,任何外部函式都可以訪問公有型別資料和函式。

在關鍵字

private

後面宣告,只允許本類中的函式訪問,而類外部的任何函式都不能訪問。

在關鍵字

protected

後面宣告,與

private

類似(基類成員可以訪問,但是基類物件不能訪問,派生成員和友元也可以訪問但只能通過派生類的物件來訪問基類部分受保護的部分。

受保護的成員

c++中使用protected關鍵字來宣告那些它希望與派生類分享但是不想被其他公共訪問使用的成員。protected可以看作是public和private中和的產物。

和private成員類似,受保護的成員對於類的使用者來說是不可訪問的

和public類似,受保護的成員對於派生類的成員和友元來說是可以訪問的

派生類的成員和友元只能通過派生類物件來訪問基類的受保護的成員。派生類對於乙個基類物件中受保護的成員沒有任何訪問許可權。

為理解最後一條,舉例如下:

class base

;class sneaky :public base

;//正確:clobber能訪問sneaky的proteced和private成員

void clobber(sneaky& s)

//錯誤:clobber不能訪問base的proteced和private成員

void clobber(base& b)

派生類的成員和友元只能訪問派生物件中的基類部分的受保護物件,對於普通的基類物件中的成員不具有特殊的訪問許可權。

公有、私有和受保護繼承

某個類對其繼承而來的成員的訪問許可權受兩個因素影響:一是基類中該成員的訪問說明符,二是派生類的派生列表中的訪問說明符

class base

;class pub_derv :public base

//錯誤:privated成員對於派生類是不可訪問的

char g()

};class priv_derv :private base

};

派生訪問說明符對於派生類的成員(及友元)能否訪問其直接基類的成員沒有什麼影響。對基類成員的訪問許可權只與基類中的訪問說明符有關。派生訪問說明符控制派生使用者(包括派生類的派生類)對於基類的訪問許可權

pub_derv d1;

priv_derv d2;

d1.pub_mem(); //正確;pub_mem在派生類中是public

d1.prot_mem; //錯誤:prot_mem在派生類中是protected

d2.pub_mem(); //錯誤:pub_mem在派生類中是private的

派生訪問說明符的目的是控制派生類的使用者(包括派生類的派生類在內)對於基類成員的訪問許可權

struct derived_from_public :public pub_derv}; 

struct derived_from_private :public priv_derv

};struct derived_from_protected :public prot_derv

};

資料抽象是一種依賴於介面和實現分離的程式設計(和設計)技術。類設計者必須關心類是如何實現的,但使用該類的程式設計師不必了解這些細節。使用者只要抽象地考慮該型別做什麼,而不必具體地考慮該類如何工作。

封裝是一項將低層次的元素組合起來形成新的、高層次的實體的技術。函式是封裝的一種形式:函式所執行的細節行為被封裝在函式這個更大的實體中。被封裝的元素隱藏了它們的實現細節——可以呼叫函式,但是不能直接訪問函式所執行的語句。同樣地,類也是乙個封裝的實體:它代表若干成員的聚集,設計良好的類隱藏了類實現的細節

內聯函式能夠提高效率,編譯的時候將**直接嵌入到呼叫到的地方,從而見曬函式呼叫的開銷,使得**增大,以時間換空間,內斂函式必須短小,宣告為內斂僅僅是給編譯器乙個提示,如果函式中有switch,for 這些語句的話,編譯器將不會以內斂方式解釋。

兩種定義方式:一是直接在類體中定義,二是在內外部定義宣告為inline

注意帶預設引數的過載函式要避免二義性

都是類,

class

與struct

的區別:在未指定訪問許可權時,

class

預設的是私有的,

struct

預設是公有的

成員函式有乙個隱含的附加形參,即指向該物件的指標,這個隱含的形參叫做

this指標

使用this

指標保證了每個物件可以擁有不同的資料成員,但處理這些成員的**可以被所有物件共享

每個類都定義了自己的作用域稱為類作用域,類作用域中說明的識別符號只在類中可見。

1、塊作用域  如以內  ,函式形參也是塊作用域 2

、檔案作用域  函式之外   3

、函式原型作用域   函式的宣告的時候形參 4

、函式作用域  goto語句 5

、類作用域

c++中類必須先定義,才能

夠例項化。

兩個類需要相互引用形成乙個「環形」引用時(a類中包含b類的標頭檔案,b類中包含a類的標頭檔案,無法先定義使用。這時候需要用到前向宣告

前向宣告的類不能例項化。可以定義指標或者引用

外圍類需要使用巢狀類物件作為底層實現,並且該巢狀類只用於外圍類的實現,且同時可以對使用者隱藏該底層實現

從作用域的角度看,巢狀類被隱藏在外圍類之中,該類名只能在外圍類中使用。如果在外圍類的作用域外使用該類名時,需要加名字限定。

巢狀類中的成員函式可以在它的類體外定義。

巢狀類的成員函式對外圍類的私有成員沒有訪問權,反之亦然。

巢狀類僅僅只是語法上的嵌入,在外界也可以使用

類也可以定義在函式體內,這樣的類被稱為區域性類(

loacl

class

)。區域性類只在定義它的區域性域內可見。

區域性類的成員函式必須被定義在類體中。

區域性類中不能有靜態成員

類與物件(一) 6 矩陣計算

問題描述 矩陣是線性代數中的重要概念,應用領域非常廣泛,在c c 中,通常將矩陣定義為乙個二維陣列。本問題中,將輸入兩個矩陣 a 和 b,實現對矩陣的數乘 矩陣加法 矩陣乘法以及行列式的計算。如果對矩陣的演算法不了解,請查閱相關資料。輸入形式 輸入的第一行為兩個正整數 m 和 n,分別表示矩陣 a ...

C Day6 類與物件 上

二 物件特性 include using namespace std const float pi 3.14 class circle 類void setcr int r 封裝 intmain 訪問許可權不同 建構函式 類名 析構函式 類名 include using namespace std c...

6 類和物件

掌握類和物件的定義 掌握訪問修飾符和構造器的用法 掌握main方法的實現形式 掌握伴生物件的使用 掌握定義工具類的案例 scala是一種函式式的物件導向語言,它也是支援物件導向程式設計思想的,也有類和物件的概念。我們依然可以基於scala語言來開發物件導向的應用程式。1.1 相關概念 什麼是物件導向...