关于类的非静态函数指针成员变量
每個類的非靜態(tài)成員函數(shù)都含有一個指向被調(diào)用對象的指針,這個指針被稱為this。
在非const成員函數(shù)中它的類型是指向該類類型的指針。
在const 成員函數(shù)中是指向const 類類型的指針。
在volatile 成員函數(shù)中是指向volatile 類類型的指針。
?
所有類的成員函數(shù)(包括非靜態(tài)和靜態(tài))都是在.text段里面,這里不存在靜態(tài)與非靜態(tài)的區(qū)別。
在《C++ Primer》中有那么一段,在類的非靜態(tài)成員函數(shù)指針和普通函數(shù)指針之間的不匹配是由于這兩種指針在表示上的區(qū)別:
普通函數(shù)指針存儲函數(shù)的地址可以被用來直接調(diào)用那個函數(shù)關于函數(shù)指針
類的非靜態(tài)成員函數(shù)指針首先必須被綁定在一個對象或者一個指針上才能得到被調(diào)用對象的this指針,然后才調(diào)用指針所指的成員函數(shù)。
?
故此,在類的靜態(tài)成員函數(shù)和外部接口函數(shù)中:(假定一個類T的非靜態(tài)函數(shù)指針成員變量int (T::*m_ProFunc)(int , int), 存在int T::funcA(int, int))
這些函數(shù)都沒有this指針,同時因為類的非靜態(tài)函數(shù)成員含有this指針的原因,無法在這些函數(shù)內(nèi)操作類的非靜態(tài)函數(shù)指針來調(diào)用指向的類靜態(tài)函數(shù)。
在這些函數(shù)內(nèi),當你嘗試使用實例對象進行操作時,例如給一個實例的形參T* t; 然后在函數(shù)里面通過指針操作該類(t->*m_ProFunc)(a, b),就無法通過編譯,因為編譯器做了函數(shù)識別與校驗。
是的,(t->T::*m_ProFunc)(a, b)這種調(diào)用函數(shù)的方式在靜態(tài)成員函數(shù)或外部接口函數(shù)都無法使用。
?
這里理解為在程序加載到內(nèi)存后,this需要有對應的內(nèi)存地址才能有效使用,否則一個指針指向未知的地址就會引發(fā)coredump;因為C++實現(xiàn)可能不對this做空判斷,所以這個直接在編譯器上在編譯時對代碼進行了校驗。既然類的非靜態(tài)函數(shù)都包括了這樣一個指針參數(shù)this,那么在類的靜態(tài)成員函數(shù)或者外部接口函數(shù)中,可以對類的非靜態(tài)成員函數(shù)指針變量進行賦值操作,但不能直接使用該變量來調(diào)用所指的成員函數(shù)。
對于必須綁定在一個對象或者一個指針上的理解,意味著想在外部函數(shù)或者靜態(tài)函數(shù)中使用函數(shù)指針調(diào)用所指成員函數(shù),僅僅只有一個類的形參是不夠的,還需要在該函數(shù)加入一個類的非靜態(tài)成員函數(shù)指針形參,用來綁定函數(shù)指針。也就是在外部函數(shù)或者靜態(tài)成員函數(shù)中,類的形參T t,不能直接使用t.m_ProFunc(a, b),只能綁定形參Func, t.Func(a, b)。不管這個形參的實參是&T::funcA(a, b),還是t.m_ProFunc(a, b)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/sciapex/p/9342728.html
總結
以上是生活随笔為你收集整理的关于类的非静态函数指针成员变量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP也能实现区块链?基础结构篇
- 下一篇: Mysql的锁机制之表锁