在C ++中实现静态成员函数

Implementation of static member function in C++

我想知道静态成员函数是否实质上意味着它在编译时在内存中获取一个地址,并且在整个程序中从不更改它。

因此,它给了我们一个机会,让我们在没有任何恐惧的情况下,通过指针传递它,因为我们总是确信,我们会永远在同一个地方找到它。


  • 使用静态函数u可以调用声明为私有的构造函数。
  • 这里是代码,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #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是对象引用,则为(x.*member_ptr)(...);如果x是指针,则为(x->*member_ptr)(...)

指向非静态成员函数的指针和指向函数的指针是不兼容的类型,并且没有可移植的方法来转换其中的一个。如果你知道这个实例,并且你想要有一个可调用对象来调用它的非成员函数,你可以使用(用C++ 11)一个EDCOX1,4来包装一个lambda。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#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
"
; }
};

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;
}