编译器如何通过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.
中声明了函数
- 第二种情况是编译器错误,因为函数声明是 'after' class 定义。所以编译器在编译构造函数时并不知道这个函数。很好。
- 第三种情况,编译器很高兴,因为它在 class 声明之前找到了原型。
现在的问题是,为什么第一种情况编译通过了?
因为成员 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 声明:一次只是将所有内容都视为声明,然后再次获取任何方法定义。
所以这是我的代码:
#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. 中声明了函数
- 第二种情况是编译器错误,因为函数声明是 'after' class 定义。所以编译器在编译构造函数时并不知道这个函数。很好。
- 第三种情况,编译器很高兴,因为它在 class 声明之前找到了原型。
现在的问题是,为什么第一种情况编译通过了? 因为成员 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 声明:一次只是将所有内容都视为声明,然后再次获取任何方法定义。