资深程序员。我已经看到一种常见的做法,是将类定义放在源文件的全局作用域中,位于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;
}
答案 0 :(得分:1)
如果将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
必须对{ {1}}使用它,而此处显示为私有)。
答案 1 :(得分:1)
很少有一个本地类会有用。举个例子:Dog
对象能做什么?您不能将其传递给任何其他函数。没有其他代码可以执行任何操作。将其数据封装在范围如此有限的对象中有什么意义?
使用此类有限的设备,是否会给同类的所有机器带来好处?构造函数,析构函数,成员函数,运算符重载等。并不是真正有用。您有private
个变量吗?可能不会。重点是什么;没有人可以将它们隐藏起来。
有时候创建本地struct
,特别是plain old data (POD)结构很有用。仅具有公共变量而没有成员函数的POD可能对快速将几个相关值进行分组很有用。即便如此,这种用法还是很少的。