靈活而奇特的C 語言特性 作用域解析(二)

2021-07-25 03:22:45 字數 2407 閱讀 6360

學習了博主的《漫談繼承技術》系列博文之後,相信大家都有所收穫吧!這次博主將和大家一起** 《靈活而奇特的c++語言特性》 ,主要包括引用、常量(const)、常量表示式(constexpr)、靜態(static)、外部(expert)、型別定義(typedef)、型別別名(aliases)、型別轉換、作用域解析、統一初始化、顯示轉換運算子、特性(attribute)、使用者自定義文字、標頭檔案、可變長度引數列表和預處理器巨集。儘管這個知識清單顯得有點凌亂,但是這些話題都是博主經過精心挑選,是容易混淆的語言特性。本篇我們來學習一下作用域解析的觀念以及使用場景,增進大家對《靈活而奇特的c++語言特性》的理解。

c++程式猿必須熟悉作用域(scope)的概念。程式中的所有名稱,包括變數、函式和類名,都具有某種作用域。可以使用命名空間、函式定義、花括號界定的塊和類定義建立作用域。當試圖訪問某個變數、函式或者類時,首先在最近作用域中查詢這個名稱,然後是相鄰的作用域,依次類推,知道全域性作用域。任何不在有名命名空間、函式、花括號界定的塊和類中的名稱都被認為在全域性作用域中。如果在全域性作用域中也找不到這個名稱,編譯器會給出乙個未定義符號錯誤。那什麼是作用域運算子呢?作用域運算子就是「::」。下面就讓我們一起結合類的靜態成員來**一下作用域運算子的使用。

類的靜態成員可以實現物件與物件之間的資料共享。類屬性是描述類的所有物件的共同特徵的資料項,對於任何物件例項,它的屬性值是相同的。靜態資料成員具有靜態生存期,可以通過「類名::靜態資料成員名」來訪問。在類的定義中僅僅對靜態資料成員進行引用性宣告,必須在命名空間作用域的某個地方使用類名限定定義性宣告,這時也可以進行初始化。靜態函式成員既可以在類定義中實現,也可以先在類中宣告,再在類定義外實現,但static關鍵字只能寫在類定義中,否則編譯出錯。

靜態成員函式可以通過類名或物件名來呼叫,而非靜態成員函式只能通過物件名來呼叫。

習慣:雖然靜態成員函式可以通過類名和物件名兩種方式呼叫,但一般習慣於通過類名呼叫。因為即使通過物件名來呼叫,起作用的也只是物件的型別資訊,與所使用的具體物件毫無關係。

在靜態成員函式中訪問非靜態成員需要指明物件,因為對靜態成員函式的呼叫是沒有目的物件的,因此不能像非靜態成員函式那樣,隱含的通過目的物件訪問類的非靜態成員。

在靜態成員函式中只能訪問靜態成員,但是在非靜態成員函式中可以訪問靜態成員。靜態資料成員可以定為

const

,但靜態成員函式不能定義為

const

,否則編譯出錯。在對類的靜態資料成員(包括公有資料成員和私有資料成員)初始化的同時,還可以引用類的其他私有成員。咱們來舉個栗子吧。

#include

using

namespacestd;

class

point ;

//引用私有建構函式,對其進行初始化

point *point::m_pptr= new

point(6);   

//引用私有建構函式,對其進行初始化

point

point::m_p= point(8);   

//私有建構函式實現

point::point(int

nvalue

/*= 0*/)

:m_nvalue(nvalue)

inline

point::~point()

inline

intpoint::getpptr()

inline

intpoint::getp()

void

point::destroy()

}int main(int

argc,char**argv){//

通過類名

::(作用域運算子

)訪問類的靜態方法

cout<< point::getpptr() << endl;//6

cout<< point::getp() << endl;//8 //

顯式的釋放

m_pptr

的空間

point::destroy();

//計算類物件的大小 //

在32位系統上,

sizeof(point)

值為8,

虛表指標和

m_nvalue各佔4

個位元組

cout<< sizeof(point)<< endl;

return0;

程式執行結果:

博主結合了作用域、可見性已經類的靜態成員和大家一起**了作用域解析。作用域解析運算子(::)單獨使用的場景只有一處,就是在訪問全域性命名空間中的名稱時候,其他都是結合著其他名稱來使用的,例如using 命名空間名稱::名稱、類名稱::靜態成員等。關於作用域解析我們就聊到這裡了,相信大家都有所收穫。

靈活而奇特的C 語言特性 引用(上)

學習了博主的 漫談繼承技術 系列博文之後,相信大家都有所收穫吧!這次博主將和大家一起 靈活而奇特的c 語言特性 主要包括引用 常量 const 常量表示式 constexpr 靜態 static 外部 expert 型別定義 typedef 型別別名 aliases 型別轉換 作用域解析 統一初始化...

靈活而奇特的C 語言特性 const(一)

學習了博主的 漫談繼承技術 系列博文之後,相信大家都有所收穫吧!這次博主將和大家一起 靈活而奇特的c 語言特性 主要包括引用 常量 const 常量表示式 constexpr 靜態 static 外部 expert 型別定義 typedef 型別別名 aliases 型別轉換 作用域解析 統一初始化...

靈活而奇特的C 語言特性 const(二)

學習了博主的 漫談繼承技術 系列博文之後,相信大家都有所收穫吧!這次博主將和大家一起 靈活而奇特的c 語言特性 主要包括引用 常量 const 常量表示式 constexpr 靜態 static 外部 expert 型別定義 typedef 型別別名 aliases 型別轉換 作用域解析 統一初始化...