類(四) 類的作用域

2021-10-07 11:54:36 字數 3056 閱讀 2857

《基於 c++ primer p253>

在類的作用域之外,普通的資料和函式成員只能由物件、引用或者指標使用成員訪問運算子來訪問。對於類型別成員則是喲個作用域運算子訪問。

screen::pos ht =

24, wd =80;

// 使用 screen 定義的 pos 型別

screen scr

(ht, wd,

' ')

;screen *p =

&scr;

char c = scr.

get();

c = p-

>

get(

);

(1)作用域和定義在類外部的成員

乙個類就是乙個作用域,因此當我們在類的外部定義成員函式時必須同時提供類名和函式名,因為在類的外部成員的名字被隱藏起來了。

而一旦遇到了類名,定義的剩餘部分(引數列表和函式體)就在類的作用域之內了。因此,我們可以直接使用類的其他成員而無須再次授權了。

void window_mgr::

clear

(screenindex i)

同時,我們注意到函式宣告中函式的返回型別位於函式名之前。因此當成員函式定義在類的外部時,返回型別中使用的名字都位於類的作用域之外。這是,返回型別必須指明它是哪個類的成員。

class

window_mgr

;window_mgr::screenindex

window_mgr::

addscreen

(const screen &s)

1.名字查詢與類的作用域

名字查詢是指尋找與所用名字最匹配的宣告的過程,其一般流程為:

①首先,在名字所處的塊中尋找其宣告語句,只考慮在名字的使用之前出現的宣告。

②如果沒有找到,繼續查詢外層作用域。

③如果最終沒有找到匹配的宣告,則程式報錯。

對於定義在類內部的成員函式來說,解析其中名字的方式有所不同。因為類的定義分兩部處理:

①首先編譯成員的宣告。

②直到類全部可見後才編譯函式體。

因此,成員函式可以使用類中定義的任何名字。

1.用於類成員宣告的名字查詢

兩階段的處理方式只適用於成員函式的函式體中使用的名字。

宣告中使用的名字,包括返回型別或者引數列表中使用的名字,都必須在使用前確保可見。

typedef

double money;

string bal;

class

account

// money 在外層作用域中定義,bal 在整個類可見後處理

private

: money bal;

};

2.型別名要特殊處理

一般來說,內層作用域可以重新定義外層作用域中的名字,即使該名字已經在內層作用域中使用過。但是在類中,如果成員函式使用了外層作用域中的某個名字,而該名字代表一種型別,則類不能在之後重新定義該名字。

typedef

double money;

class

account

private

:typedef

double money;

// 錯誤:不能重複定義 money,即使與外層作用域一致也不行

money bal;

// ...

};

型別名的定義通常出現在類的開始處,這樣就能確保所有使用該型別的成員都出現在型別的定義之後。

3.成員定義中的普通塊作用域的名字查詢

成員函式中使用的名字按照如下方式解析:

①首先在成員函式內部查詢該名字的宣告,只有在函式使用之前出現的宣告才被考慮。

②如果沒有找到,在類內繼續查詢,這是類的所有成員都可以被考慮。

③如果沒有找到,在成員函式定義之前的作用域內繼續查詢。

// 注意:這段**僅為了說明而用,不是一段很好的**

// 通常情況下不建議為引數和成員使用同樣的名字

int height;

// 外層作用域的 height

class

screen

// 這裡的 height 指的是引數宣告

private

: pos cursor =0;

pos height =

0, width =0;

};

上面的**中,height 引數隱藏了同名的成員。如果想繞開查詢規則,可以將**改為:

void screen::

dummy_fcn

(pos height)

最好的方式是給引數起另外乙個名字:

void screen::

dummy_fcn

(pos ht)

4.類作用域之後,在外圍的作用域中查詢

上面的**中,height 引數隱藏了同名的外層作用域的成員。如果想繞開查詢規則,可以將**改為:

void screen::

dummy_fcn

(pos height)

5.在檔案中名字的出現處對其進行解析

當成員定義在類的外部時,名字查詢的第三步不僅要考慮類定義之前的全域性作用域中的宣告,還需要考慮在成員函式定義之前的全域性作用域中的宣告。

int height;

// 外層作用域的 height

class

screen

;screen::pos verify

(screen::pos)

;// 全域性函式 verify 的宣告

void screen::

setheight

(pos var)

注意,雖然全域性函式 verify 的宣告在 screen 類的定義之前是不可見的,但是名字查詢的第三步考慮在成員函式定義之前的全域性作用域中的宣告,因此是正確的。

《Inside C 》筆記 四 類

類是對資料結構和演算法的封裝。一 類成員 類成員包括以下幾類,作者在後面的章節會詳細講解。字段 用來儲存資料,可用static readonly const來修飾 方法 運算元據的 屬性 用來控制對類內部變數的訪問 常量 索引器 事件和運算子。二 訪問修飾符 public 可被外部的類和派生類訪問 ...

類的作用域

更多c 類的基本概念 每個類都會定義它自己的作用域。在類的作用域外,普通的資料和函式成員只能由物件 引用或者指標使用成員訪問運算子來訪問。對於類型別成員則使用作用域運算子訪問。不論哪種情況,跟在運算子之後的名字都必須是對應類的成員。作用域和定義在類外部的成員 乙個類就是乙個作用域很好地解釋為什麼當我...

四類設計人員

個人覺得設計人員可以分為四種型別 模組設計人員 框架設計人員 專業領域設計人員 系統設計人員,這四種型別的設計人員並沒有什麼絕對的誰強誰弱,只能說各有千秋吧,但一定程度上來講,四種型別之間還是存在著一些關聯,來看看這四類設計人員的專注點和關聯吧 1 模組設計人員 模組設計人員更加專注於模組的詳細設計...