Person.h
#ifndef PERSON_H_
#define PERSON_H_
/* Person.h */
class Person {
int age;
std::string name;
public:
Person(int, std::string);
std::string getName();
int getAge();
};
#endif /* PERSON_H_ */
person(int std :: string)函数声明使用std :: string名称,但我没有将它包含在头文件中。因此,我希望编译器抱怨丢失的符号。然而它编译并运行良好!为什么呢?
剩下的代码......
Person.cpp
#include <string>
#include "Person.h"
Person::Person(int age, std::string name)
{
this->name = name;
this->age = age;
}
std::string Person::getName()
{
return this->name;
}
int Person::getAge()
{
return this->age;
}
Main.cpp的
#include <string>
#include "Person.h"
int main() {
printFunc();
Person chelsea_manning(5, std::string("Chelsea Manning"));
}
另外,我是C ++的新手,所以如果你看到我的代码/ OOP有什么奇怪的话,请告诉我。
答案 0 :(得分:4)
程序的编译从包含main
函数的文件的顶部开始(从技术上讲,预编译器在编译程序之前运行,但它仍然在同一个地方启动)。在您的情况下,它首先做的是将<string>
包含在该文件中。然后它包括Person.h
。由于已经包含<string>
,因此字符串文件的所有内容都位于代码中的person文件之前,并且所有内容都以正确的顺序声明。如果您要在Person.h
之前添加<string>
,或者不包含在主文件中,则确实会收到编译错误。
#include
方向就像复制/粘贴一样:它从字面上读取<string>
文件,并将其内容发送到其中包含的源文件中。接下来,对Person.h
做同样的事情。因此运行预处理器后的最终结果是
<-- contents of <string> -->
<-- contents of Person.h -->
int main()
...
因此,在您的示例中,所有内容都以正确的顺序声明。