C/C++基礎:靜態成員函數

靜態成員函數爲什麼不能訪問本類中的非靜態成員?

和靜態數據成員一樣,靜態成員函數是類的一部分,而不是對象的一部分。如果要在類外調用公用的靜態成員函數,要用類名和域運算符“∷”。如 Box∷volume( ); 實際上也允許通過對象名調用靜態成員函數,如 a.volume( ); 但這並不意味着此函數是屬於對象a的,而只是用a的類型而已。 靜態成員函數的作用是爲了能處理靜態數據成員。 可以說,靜態成員函數與非靜態成員函數的根本區別是:非靜態成員函數有this指針,靜態成員函數並不屬於某一對象,它與任何對象都無關,靜態成員函數沒有this指針。由此決定了靜態成員函數不能訪問本類中的非靜態成員。 在C++程序中,靜態成員函數主要用來訪問靜態數據成員,而不訪問非靜態成員。假如在一個靜態成員函數中有以下語句: cout<<height<<endl; //若height已聲明爲static,則引用本類中的靜態成員,合法 cout<<width<<endl; //若width是非靜態數據成員,不合法 但是,並不是絕對不能引用本類中的非靜態成員,只是不能進行默認訪問,因爲無法知道應該去找哪個對象。如果一定要引用本類的非靜態成員,應該加對象名和成員運算符“.”。如 cout<<a.width<<endl; //引用本類對象a中的非靜態成員

靜態成員函數中不允許引用類的非靜態成員,但可以訪問對象中的非靜態成員

爲什麼靜態成員函數不能申請爲const?

將成員聲明爲const就是承若不會修改該函數所屬對象,但是static成員不屬於對象,所以不能將static函數聲明爲const。

Const用於後置修飾成員函數時,意味着被修飾的成員函數的隱士參數(this指針)由原來的Class *const轉換爲const Class *const類型,使得該成員函數不能修改成員屬性,除非該屬性被mutable修飾。

Static類函數沒有this指針,其本質上屬於c函數,滿足_cdel調用協定,而成員函數被稱爲_thiscall,帶有隱士的this指針參數。

全局變量和static全局變量的區別:

全局變量的說明之前再加以static 就構成了靜態的全局變量。

全局變量本身就是靜態存儲方式靜態全局變量當然百也是靜態存儲方式。這度兩者在存儲方式上並無不同。

這兩者的區別雖在於非靜態全局變量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是知有效的。

靜態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,在同一源程序道的其它源文件中不能使用它。由於靜態全局變量的作用域侷限於一個源文件內,只能爲該源文件內的函數公用,因此可以避免在內其它源文件中引起錯誤。

從以上分析可以看出,把局部變量改變爲靜態變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變爲靜態變量後是改變了它的作容用域, 限制了它的使用範圍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章