首页 > 解决方案 > 为什么头文件有单独的实现文件?(我的教授是正确的吗?)

问题描述

之前,这个问题被标记为重复,我的目的是不重复它,而是要找出我的教授给我的关于这个问题的答案(在课堂上被问到时)是否正确。我持怀疑态度的原因是因为我看不出他的答案在现实世界的场景中如何实用甚至可能。

我的教授给出的答案与实现文件的安全性有关。他说,如果我们不将实现文件与头文件分开,那么任何使用此头文件的人也将可以访问函数的实现。但是,如果我们有一个单独的实现文件,那么它将为类函数的实现增加安全性(如何?),因为人们只能看到声明而不是它的定义(为什么不呢?)。

他给出的另一个原因是因为编译。他说每次程序运行都会编译头文件,这里一个cpp文件会创建一个目标文件,不会每次都编译。(这是有道理的)。

有人可以验证这个答案的完整性,因为我找不到它

非常感谢!

标签: c++oop

解决方案


如果我们谈论 C 似乎是合理的:

// foo.h
struct MyObject;

struct MyObject *CreateAnObject();
void DoSomethingWithAnObject(struct MyObject *);

// foo.c
struct MyObject {
   int a;
   int b;
};

struct MyObject *CreateAnObject() {
  struct MyObject *obj = malloc(sizeof(*obj));
  ...
  return obj;
}

void DoSomethingWithAnObject(struct MyObject *) {
  ...
}

在这里,你的头文件的用户不能乱用“MyObject”的内容,因为他们不知道它的内容。

然而,在 C++...

我们明确有能力将类的一部分标记为公共或私有。所以没有真正的对象安全需要隐藏对象的内容。

// foo.hpp
class MyObject {
 public:
   MyObject();
   void DoSomething();

 private:
   int a;
   int b;
};

// foo.cpp
MyObject::MyObject() { ... }
void MyObject::DoSomething() { ... }

推荐阅读