C++ C++;编译器自动将我的函数设置为静态?

C++ C++;编译器自动将我的函数设置为静态?,c++,singleton,instance,C++,Singleton,Instance,下面是我的问题和示例代码。 如果类函数从不使用实例相关数据或从不引用此,编译器能否确定此函数是静态函数 作为示例,请参见以下代码(说明如下): 我应该有seg故障。因为instance()将反引用nullptr 相反,程序运行,输出将为: bar …只有这一行,所以它似乎既不调用构造函数也不调用析构函数 但是如果我的foo()函数是: void foo() { mData = 5; std::cout <&l

下面是我的问题和示例代码。 如果类函数从不使用实例相关数据或从不引用此,编译器能否确定此函数是静态函数

作为示例,请参见以下代码(说明如下):

我应该有seg故障。因为instance()将反引用
nullptr

相反,程序运行,输出将为:

bar
…只有这一行,所以它似乎既不调用构造函数也不调用析构函数

但是如果我的
foo()
函数是:

        void foo()
        {
            mData = 5;
            std::cout << "bar" << std::endl;
        }
输出为:

        statci Dummy& instance()
        0
        bar

我真的不明白这里的工作方式/

您可以将成员函数(非静态)视为具有隐藏参数(指向对象的指针)的函数。因此您的
void foo()
可以被视为
void foo(Dummy*d)
。由于您从未使用指向Dummy的指针,所以如果您向它传递空指针,这并不重要

希望这有意义:)

有关此类未定义行为的进一步阅读:

您可以将成员函数(非静态)视为具有隐藏参数的函数,该参数是指向对象的指针。因此您的
void foo()
可以被视为
void foo(Dummy*d)
。由于您从未使用指向Dummy的指针,所以如果您向它传递空指针,这并不重要

希望这有意义:)

有关此类未定义行为的进一步阅读:

此行为的原因是“foo()”不是虚拟的,因此调用它的对象仅在编译时用于类型信息。在运行时,它为null的事实没有任何影响,除非您在“foo()”中使用了“this”,否则您会感到非常惊讶,就像您试图设置隐式使用“this”的成员变量时所做的那样。

此行为的原因是“foo()”不是虚拟的,因此,调用它的对象在编译时仅用于类型信息。在运行时,它为null这一事实没有任何影响,除非您在“foo()”中使用了“this”,否则您会感到非常惊讶,就像您试图设置隐式使用“this”的成员变量时一样。

好的,谢谢。事实上,我忘了我想的那些未定义的行为。。。最让我吃惊的是从nullptr取消引用,但现在看来这似乎合乎逻辑:)没有从nullptr取消引用,因为该方法不是虚拟的。好的,谢谢。事实上,我忘了我想的那些未定义的行为。。。最让我吃惊的是从nullptr取消引用,但现在看来这似乎合乎逻辑:)没有从nullptr取消引用,因为该方法不是虚拟的。
        void foo()
        {
            mData = 5;
            std::cout << "bar" << std::endl;
        }
        Dummy& vDummy = Dummy::instance();
        std::cout << &vDummy << std::endl;
        vDummy.foo();
        statci Dummy& instance()
        0
        bar