编译器如何通过class?

How does the compiler go through a class?

所以这是我的代码:

#include<iostream>
using namespace std;

class simpleClass
{
public:
    int var;

    simpleClass(int value)
    {
        var = value;
        memberFunc(var);  
    }

    void memberFunc(int var);
};



int main(int argc, char** argv)
{
    simpleClass(10);
    return 0;
}

这编译得很好。不会 运行 因为我没有定义 memberFunc 但它编译得很好。现在我从 class 中删除 memberFunc 并将其放在外面。

#include<iostream>
using namespace std;

class simpleClass
{
public:
    int var;

    simpleClass(int value)
    {
        var = value;
        memberFunc(var);  
    }

    //void memberFunc(int var);
};

void memberFunc(int var);

int main(int argc, char** argv)
{
    simpleClass(10);
    return 0;
}

由于显而易见的原因,这不是编译器。 现在我将原型移动到 class.

的顶部
#include<iostream>
using namespace std;

void memberFunc(int var);

class simpleClass
{
public:
    int var;

    simpleClass(int value)
    {
        var = value;
        memberFunc(var);  
    }

    //void memberFunc(int var);
};


int main(int argc, char** argv)
{
    simpleClass(10);
    return 0;
}

当然可以编译。

下面是我的问题。

现在的问题是,为什么第一种情况编译通过了? 因为成员 class 声明是 构造函数之后。那么编译器是怎么知道函数声明的呢?因为编译器应该按顺序处理代码。

是否有人可以解释一下是否有编译 class 的特定程序?

谢谢。

如果您内联定义 class 成员函数,语义就好像您的 class 定义只包含成员函数声明和紧跟在 class 定义之后的定义。也就是说,

struct Foo
{
    int & f() { return n; }
    int n;
};

解析为:

struct Foo
{
    int & f();
    int n;
};

inline int & Foo::f() { return n; }

特别是,在成员函数体中,class 总是完整且完全定义的。

编译器两次检查完整的 class 声明:一次只是将所有内容都视为声明,然后再次获取任何方法定义。