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

靜態成員函式為何不能const

修飾符不可用於靜態成員函式

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

而static類函式並沒有隱式的this指標,因為其本質上還是屬於C函式——滿足__cdecl呼叫協定。
而成員函式被稱為__thiscall,帶有隱式的this指標引數。

由此想到的:

_thiscall 和 _cdecl 的區別,於是找到了這樣的一篇好文,這裡我們只保留其結論部分:

在C或C++語言呼叫中預設的函式修飾_cdecl,由主呼叫函式進行引數壓棧並且恢復堆疊,實參的壓棧順序是從右到左,最後由主調函式進行堆疊恢復。由於主呼叫函式管理堆疊,所以可以實現變參函式。另外,命名修飾方法是在函式前加一個下劃 線(_). 

_stdcall在主呼叫函式中負責壓棧,在被呼叫函式中負責彈出堆疊中的引數,並且負責恢復堆疊。因此不能實現變參函式,引數傳遞是從右到左。另外,命 名修飾方法是在函式前加一個下劃線(_),在函式名後有符號(@),在@後面緊跟引數列表中的引數所佔位元組數(10進位制),如:void   Input(int   &m,int   &n),被修飾成:[email protected]  對於大多數api函式以及視窗訊息處理函式皆用CALLBACK,所以呼叫前,主調函式會先壓棧,然後api函式自己恢復堆疊。

_cdecl是C和C++程式的預設呼叫方式。每一個呼叫它的函式都包含清空堆疊的程式碼,所以產生的可執行檔案大小會比呼叫_stdcall函式的大。

thiscall僅僅應用於“C++”成員函式。this指標存放於CX暫存器,引數從右到左壓。thiscall不是關鍵詞,因此不能被程式設計師指定。

相關推薦

為什麼靜態成員函式不能是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中使用非靜態成