c++ - 为什么头文件有单独的实现文件?(我的教授是正确的吗?)
问题描述
之前,这个问题被标记为重复,我的目的是不重复它,而是要找出我的教授给我的关于这个问题的答案(在课堂上被问到时)是否正确。我持怀疑态度的原因是因为我看不出他的答案在现实世界的场景中如何实用甚至可能。
我的教授给出的答案与实现文件的安全性有关。他说,如果我们不将实现文件与头文件分开,那么任何使用此头文件的人也将可以访问函数的实现。但是,如果我们有一个单独的实现文件,那么它将为类函数的实现增加安全性(如何?),因为人们只能看到声明而不是它的定义(为什么不呢?)。
他给出的另一个原因是因为编译。他说每次程序运行都会编译头文件,这里一个cpp文件会创建一个目标文件,不会每次都编译。(这是有道理的)。
有人可以验证这个答案的完整性,因为我找不到它
非常感谢!
解决方案
如果我们谈论 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() { ... }
推荐阅读
- r - 无法从加载的包中找到函数
- awk - 使用 awk 通过密钥文件从文件中获取值
- javascript - Opensea JS SDK createSellOrder 方法似乎不起作用或静默失败
- javascript - 使用 Reactjs 和 WebRTC 选择屏幕后,屏幕共享屏幕不显示
- typescript - 如何在 vue 3 组合 API 中更新(设置)道具值?
- python - Django 授权装饰器(例如:需要登录)如何工作?
- excel - Excel VBA 检查以前版本中的项目
- message-queue - 多个开发者如何使用同一个队列进行开发?
- next.js - 有没有办法使用 next.config.js 为下一个 js 中的所有本地图像设置前缀?
- python - 从字典调用的python中的模拟函数