c++ - 类定义应该放在全局范围内还是局部范围内?
问题描述
各位程序员。我已经看到将类定义放在源文件的全局范围内是一种常见的做法,在main()
函数上方我暂时不担心类定义的细节。
class Dog { ... };
int main() {
Dog dog1;
...
return 0;
}
我们为什么要这样做?这是一个规则还是只是一个共同的约定?我们也可以将类定义放在main()
函数中吗?这样做有什么优点/缺点?
考虑以下两行代码:
class Dog { ... } dog1;
int dog1;
对我来说,这似乎class Dog { ... }
只是一种数据类型int
。
如果我main()
只在函数内部使用某个类的对象,为什么不把类定义main()
也放在函数内部呢?这是不好的编程习惯吗?或者这是只有 C 程序员对结构做的事情?将类定义放在全局范围内的原因是什么?
int main() {
class Dog { ... };
Dog d1;
...
return 0;
}
解决方案
如果您将 inside 的定义Dog
放入main
,则该定义的范围就像其他名称一样。
这意味着外部函数main
看不到 的定义Dog
,因此您无法定义(例如)将 aDog
作为参数的函数。所以,这有效:
class Dog {};
void foo(Dog const &d); // no problem
int main() {
Dog d;
foo(d);
}
...但这不是:
void foo(Dog const &d);
int main() {
class Dog {} d;
foo(d);
}
...并且添加前向声明Dog
也不起作用。
大多数类型基本上对所有代码都是可见的,因此它们通常定义在任何函数之外。
一些类型仅供其他特定类型使用,在这种情况下,它们通常在该类型中定义:
class linked_list {
class node {};
};
现在有一个名为 的类型linked_list::node
,但您需要linked_list
找到限定符node
(当然,node
必须公开才能让外部的任何东西linked_list
使用它,而这里显示为私有)。
推荐阅读
- oracle-apex - 如何将报告直接发送到打印机?
- javascript - 使用 jscolor 颜色选择器将行添加到表中,但选择器未显示
- typescript - 这个三元运算的返回类型?(除任何以外)
- python - 在 1-2 个 epoch 后具有三元组损失的特征学习产生 100% 的 val 准确度?
- python - 为什么 tensorflow.rank 总是返回空值的形状
- python - 我想用 QMediaPlayer 播放 mp3
- javascript - 通过 google Forms API 和 Google App 脚本自动提交 Google Form
- wordpress - 如何在没有钩子的情况下在 WooCommerce 评论订单表中添加文本
- c# - 可以在同一台机器上的多个端点共享同一个端口吗?
- python - 有没有办法修复逗号溢出的 CSV 文件数据