class 定义应该放在全局还是局部范围内?

Should a class definition be put in the global or local scope?

各位程序员。我已经看到将 class 定义放在源文件中的全局范围内的常见做法,在 main() 函数之上 我不担心 class 定义的细节现在。

class Dog { ... };

int main() {
    Dog dog1;
    ...
    return 0;
}

我们为什么要这样做?这是一条规则还是只是一个共同的惯例?我们是否也可以将 class 定义放在 main() 函数中?这样做的 advantages/disadvantages 是什么?

考虑以下两行代码:

class Dog { ... } dog1;
int dog1;

对我来说 class Dog { ... } 就像 int 一样只是一种数据类型。

如果我打算只在 main() 函数中使用一些 class 的对象,为什么不把 class 定义也放在 ​​main() 函数中呢?这是糟糕的编程习惯吗?或者这是只有 C 程序员才能用结构做的事情吗?将 class 定义放在全局范围内的原因是什么?

int main() {
    class Dog { ... };

    Dog d1;
    ...
    return 0;
 }

如果将 Dog 的定义放在 main 中,则该定义的作用域与其他名称一样。

这意味着 main 之外的函数看不到 Dog 的定义,因此您不能定义(例如)将 Dog 作为参数的函数范围。所以,这有效:

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 必须是 public linked_list 之外的任何东西都可以使用它,而在这里它显示为私有)。

本地 class 很少有用。举个例子:你可以用 Dog 对象做什么?您不能将它传递给任何其他函数。没有其他代码可以用它做任何事情。将其数据封装在范围如此有限的对象中有什么意义?

class 的所有机器都可以使用如此有限的东西吗?构造函数、析构函数、成员函数、运算符重载等。其实没什么用。你有 private 个变量吗?可能不会。重点是什么;没有人可以隐藏他们。

有时创建本地 struct 很有用,尤其是 plain old data (POD) 结构。仅包含 public 变量且没有成员函数的 PODs 对于快速分组几个相关值可能很有用。尽管如此,这种用法还是很少见。