1

人.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 名称,但我没有将它包含在头文件中。因此,我希望编译器抱怨缺少符号。然而它编译并运行良好!为什么?

剩下的代码...

个人.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;
}

主文件

#include <string>
#include "Person.h"

int main() {

  printFunc();

  Person chelsea_manning(5, std::string("Chelsea Manning"));

}

另外,我是 C++ 新手,所以如果您发现我的代码 / OOP 有任何奇怪之处,请告诉我。

4

1 回答 1

5

程序的编译从包含您的main函数的文件的顶部开始(从技术上讲,预处理器在程序编译之前运行,但它仍然在同一个位置开始)。在您的情况下,它所做的第一件事就是包含<string>在该文件中。然后它包括Person.h. 由于<string>已经包含在内,因此字符串文件的所有内容都在代码中的人员文件之前,并且所有内容都以正确的顺序声明。如果您要包含Person.hbefore<string>或不包含<string>在您的主文件中,您确实会收到编译错误。

#include方向就像复制/粘贴:它从字面上读取<string>文件并将其内容拍打到包含它的源文件中。接下来,对Person.h. 所以运行预处理器后的最终结果是

<-- contents of <string> -->
<-- contents of Person.h -->

int main()
...

因此,在您的示例中,所有内容都以正确的顺序声明。

于 2013-11-03T04:01:29.517 回答