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

时间:2018-08-18 01:12:41

标签: c++ class oop organization

资深程序员。我已经看到一种常见的做法,是将类定义放在源文件的全局作用域中,位于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;
 }

2 个答案:

答案 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可能对快速将几个相关值进行分组很有用。即便如此,这种用法还是很少的。