[英]Implementation of static member function in C++
我想知道靜態成員函數是否本質上意味着它在編譯時獲取內存中的地址,而在整個程序中從未更改過。
因此,它使我們有機會毫無顧忌地在指針中傳遞它,因為我們始終確信我們將永遠在同一個地方找到它。
所有函數都在編譯時分配了靜態地址(對於動態加載的庫,這有點不同)。 成員函數(靜態或非靜態)是標准函數,其地址在編譯時已知。 鏈接器還可以如何工作?
這是代碼,
#include <iostream> using namespace std; class STATIC { private: STATIC() { cout<<"In Constructor..."<<endl; } public: static void fun() { STATIC a1; } }; int main() { STATIC::fun(); }
這是使用靜態成員函數的一種。
靜態成員函數只是一個帶有有趣名稱的常規自由函數。 指向函數的指針與指向靜態成員函數的指針兼容。
相反,非靜態成員函數是一個函數,該函數接收this
參數並將其作為第一個參數進行額外的隱式隱藏。 但是,指向非靜態成員函數的指針與指向函數的指針不兼容。
要使用指向成員函數的指針來調用非靜態成員函數,您需要提供一個實例...而且語法也很奇怪: (x.*member_ptr)(...)
如果x
是對象引用,或者(x->*member_ptr)(...)
如果x是指針。
指向非靜態成員函數的指針和指向函數的指針是不兼容的類型,並且沒有可移植的方式可以將彼此轉換。 如果您知道實例,並且希望有一個可調用對象來調用其非成員函數之一,則可以使用(與C ++ 11一起)包裝lambda的std::function
。
#include <functional>
#include <string.h>
#include <iostream>
struct Foo {
int x;
Foo(int x) : x(x) {}
void bar() { std::cout << x << std::endl; }
static void baz() { std::cout << "Here\n"; }
};
int main(int argc, const char *argv[]) {
void (Foo::*f)() = &Foo::bar; // Non-static function member pointer
void (*g)() = &Foo::baz; // Static member function = function
Foo x(42);
(x.*f)(); // Prints 42
g(); // Prints "Here"
// Portable way to call a non-static member function just using ff()
std::function<void()> ff = [&x](){ x.bar(); };
ff(); // Prints 42 too
// Hack zone... just to show that on many compilers
// even a pointer to non-static member function is just
// a pointer to a function that accepts however `this`
// as an extra first parameter.
void (*hack)(void *);
memcpy(&hack, &f, sizeof(hack));
hack(&x); // Prints 42 too on g++/clang++ (NOT PORTABLE!!)
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.