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 对于快速分组几个相关值可能很有用。尽管如此,这种用法还是很少见。
各位程序员。我已经看到将 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 对于快速分组几个相关值可能很有用。尽管如此,这种用法还是很少见。