gpt4 book ai didi

c++ - C++ 编译器会自动将我的函数设置为静态函数吗?

转载 作者:行者123 更新时间:2023-11-27 23:06:56 28 4
gpt4 key购买 nike

这是我的问题示例代码。在类函数从不使用实例相关数据或从不引用 this 的情况下,编译器是否可以决定此函数是静态的?

例如,请看这段代码(下面有描述):

class Dummy
{
public:
Dummy()
{
std::cout << "Dummy()" << std::endl;
mInstance = this;
}
~Dummy()
{
std::cout << "~Dummy()" << std::endl;
mInstance = nullptr;
}

static Dummy& instance()
{
std::cout << "static Dummy& instance()" << std::endl;
return *mInstance;
}

void foo()
{
std::cout << "bar" << std::endl;
}


private:
int mData;
static Dummy* mInstance;


};

Dummy* Dummy::mInstance = nullptr;
  • 在构造时,我的 Dummy 类使用指针在名为 mInstancestatic 变量中引用它的实例。
  • mInstance 可通过 static 函数 instance() 获得。
  • foo() 不是一个static 函数。因此我需要一个实例来调用它。
  • mInstance 被初始化为 nullptr

如果我的 main 只做这种情况:

Dummy::instance().foo();

我应该得到一个段错误。因为 instance() 会取消引用 nullptr

相反,程序运行并且输出将是:

bar

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

然而,如果我的 foo() 函数是:

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

此处发生段错误

我倾向于猜测,因为 foo() 实际上没有引用任何适合实例的内容,编译器猜测它是静态的并以这种方式编译。但这似乎不符合逻辑,因为 instance() 函数返回对实例的引用,即使 foo() 是静态的,foo() 不应该被调用...

另一个例子,没有mData = 5指令,如果我的main是:

        Dummy& vDummy = Dummy::instance();
std::cout << &vDummy << std::endl;
vDummy.foo();

输出是:

        statci Dummy& instance()
0
bar

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

最佳答案

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

希望这是有道理的:)

进一步阅读此类未定义行为: When does invoking a member function on a null instance result in undefined behavior?

关于c++ - C++ 编译器会自动将我的函数设置为静态函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22985192/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com