1. 程式人生 > >為什麼靜態成員函式不能是const

為什麼靜態成員函式不能是const

static在c++中的第五種含義:用static修飾不訪問非靜態資料成員的類成員函式。這意味著一個靜態成員函式只能訪問它的引數、類的靜態資料成員和全域性變數。    不能用const的原因:
     這是C++的規則,const修飾符用於表示函式不能修改成員變數的值,該函式必須是含有this指標的類成員函式,函式呼叫方式為thiscall,而類中的static函式本質上是全域性函式,呼叫規約是__cdecl或__stdcall,不能用const來修飾它。<span style="line-height:26px">一個靜態成員函式訪問的值是其引數、靜態資料成員和全域性變數,而這些資料都不是物件狀態的一部分。而對成員函式中使用關鍵字const是表明:函式不會修改該函式訪問的目標物件的資料成員。既然一個靜態成員函式根本不訪問非靜態資料成員,那麼就沒必要使用const了。</span>
   什麼時候使用靜態資料成員和靜態函式呢?       定義資料成員為靜態變數,以表明此全域性資料邏輯上屬於該類。       定義成員函式為靜態函式,以表明此全域性函式邏輯上屬於該類,而且該函式只對靜態資料、全域性資料或者引數進行操作,而不對非靜態資料成員進行操作。    static的第一種含義:修飾全域性變數時,表明一個全域性變數只對定義在同一檔案中的函式可見。    static的第二種含義:修飾區域性變數時,表明該變數的值不會因為函式終止而丟失。    static的第三種含義:修飾函式時,表明該函式只在同一檔案中呼叫。    static的第四種含義:修飾類的資料成員,表明對該類所有物件這個資料成員都只有一個例項。即該例項歸 所有物件共有。    static的第五種含義:修飾類成員函式,如上。

相關推薦

為什麼靜態成員函式不能是const

static在c++中的第五種含義:用static修飾不訪問非靜態資料成員的類成員函式。這意味著一個靜態成員函式只能訪問它的引數、類的靜態資料成員和全域性變數。    不能用const的原因: 這是C++的規則,const修飾符用於表示函式不能修改成員變數的值,該

靜態成員函式為何不能const

修飾符不可用於靜態成員函式 const用於後置修飾函式時只用於限定成員函式,意味著將被修飾的成員函式的隱式引數——this指標由原來的Class* const變為const Class* const型別,使得在該成員函式內不能修改成員屬性,除非該屬性被mutable修飾。

4、【C++】靜態成員變數/靜態成員函式/行內函數/友元函式/友元類/友元成員函式

一、靜態成員     我們可以使用 static 關鍵字來把類成員定義為靜態的。當我們宣告類的成員為靜態時,這意味著無論建立多少個類的物件,靜態成員都只有一個副本。     靜態成員在類的所有物件中是共享的。如果不存在其他的初始化語句,在建立第一個物件時,所有的靜態資料都會被初始化為

beginthreadex()函式在建立多執行緒傳入回撥函式時,好像只能傳入全域性函式或類的靜態成員函式,請問能不能傳入類的成員函式呢(非靜態)?

C++類成員函式直接作為執行緒回撥函式2009年06月01日 星期一 17:01我以前寫執行緒時要麼老老實實照著宣告寫,要麼使用C++類的靜態成員函式來作為回撥函式,經常會因為執行緒程式碼而破壞封裝.之前雖然知道類成員函式的展開形式,但從沒想過利用過它,昨天看深入ATL時無意中學

C++筆記 第二十六課 類的靜態成員函式---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第二十六課 類的靜態成員函式 1.未完成的需求 統計在程式執行期間某個類的物件數目 保證程式的安全性(不能使用全域性變數) 隨時可以獲取當前物件的數目(Failure)

《隨筆五》——C#中的 —— “ 靜態成員的生存期 、靜態成員函式成員常量”

目錄 靜態成員的生命期 靜態成員函式 成員常量 常量與靜態量 先看一個靜態欄位的示例: namespace Ch05Ex03 { class Persion { int Mem1; static int Mem2; //

靜態成員函式的用法

靜態成員函式不依賴於物件,可以通過類直接呼叫,與物件無關: 如:獲取當前系統時間的小時部分時不需要定義QTime物件 int hour = QTime::currentTime().hour()   ——————————————————————————————————————————————

面試題-面向物件-靜態成員變數以及靜態成員函式

問題1:問:在類中,靜態資料成員和普通資料成員有何區別? 答: 1.普通資料成員屬於類的物件,物件被建立後,普通資料成員才會分配記憶體。靜態資料成員屬於整個類,即使沒有建立物件,它也存在。 2.只能

C++---類的靜態成員變數和靜態成員函式

class Person { public : Person() { } static int m_Age ; //加入static 就是靜態成員變數,會共享資料; //靜態成員變數,在類內宣告,類外進行初始化; } int Person.m_Age = 0; //類外初始化

C++中靜態成員變數和靜態成員函式的用法

昨天在修改專案函式功能時,在其中一個類中添加了一個靜態成員變數和兩個靜態成員函式,結果在連結時出現一個非常典型的錯誤:“The following symbols referenced in processor “p0” could not be resolve

靜態成員&&靜態成員函式

reference to non-static member function must be called sort(numbers.begin(),numbers.end(),cmp); 做演算法題的時候遇到的一個問題,和成員函式相關,這裡記錄一下備忘。 首先上程式碼: cl

筆記八:靜態變數、靜態成員函式函式指標、靜態函式指標

靜態變數 1、靜態變數的儲存方式和生命週期:屬於靜態儲存方式,其儲存空間為記憶體中的靜態資料區,該區域的資料在整個程式的執行期間不會釋放,所以其生命週期為整個程式執行時間段。 2、靜態區域性變數:定義在函式體內的變數。當對靜態區域性變數進行初始化時,只

C++之靜態成員函式為什麼不能為虛擬函式

應該知道靜態成員函式屬於類,也屬於物件,但終歸屬於類,他在記憶體中只有一份。而虛擬函式必須根據物件型別才能知道呼叫哪一個虛擬函式,故虛擬函式是一定要在物件的基礎上才可以的,兩者一個終歸屬於類,一個必依賴

類的靜態資料成員和類的靜態成員函式

class Point { public: Point (int xx=0,int yy=0){X=xx;Y=yy;CountP++}; Point (Point &p); int GetX(){return X;} int GetY(){return Y;} static void Ge

C++ 靜態成員函式 訪問 類成員變數 & 函式指標、函式指標陣列、函式指標陣列指標的使用 & 回撥函式的使用

靜態成員函式可以通過引用類物件訪問類成員變數;test.h#ifndef TEST_H #define TEST_H class Test { public: Test(); Tes

靜態成員靜態成員函式的總結

一、靜態成員的特點: (1)static資料成員在類的內部宣告,但只能在類的外部定義,在類的外部不能指定static,在類的定義時候進行初始化; (2)static資料成員只能在類的外部進行初始化(特例:當整型const static資料成員被常量表達式初始化時,就可以在類的內部進行初始化,

C++的靜態成員函式指標

先簡單的說說非靜態的成員函式。 非靜態成員函式指標的型別:     類的非靜態成員是和類的物件相關的。也就是說,要通過類的物件來訪問變數。 成員函式的型別定義為:     typedef void (A::*pfunc)();  A是一個類,有一個成員函式void test

靜態成員函式不可以訪問類中的成員變數

原因:因為靜態成員函式在類物件構造時沒有分配this指標(非靜態成員函式則具有this指標),相當於是全域性函式,是屬於類的,而類的成員變數只有類物件(例項)能夠訪問,成員變數只有例項化才有意義。 解決辦法:靜態成員函式增加一個類的指標或引用作為引數。如

靜態成員函式和static的作用及用法

類裡面的靜態成員函式相當於類裡面的全域性函式,它能訪問類裡面的私有建構函式、解構函式、普通函式以及成員變數,靜態成員只能通過靜態成員函式進行訪問。 靜態私有成員在類外不能被訪問,可通過類的靜態成員函式來訪問; 當類的建構函式是私有的時,不像普通類那樣例項化自己,只能通過靜態

靜態成員函式、this指標、物件指標和動態物件使用小結

·靜態成員函式就是使用static 關鍵字宣告的成員函式  在類外實現時不加static關鍵字,只有在類內宣告時才加static·靜態成員函式是類的一部分,作用是為了處理靜態資料成員  沒有this指標·靜態成員函式可以直接訪問該類的靜態成員,但不能直接訪問類中的非靜態成員·若想在靜態成員fun中使用非靜態成