C++ - 命名空间 vs. 静态函数

6

可能是重复问题:
命名空间+函数与类上的静态方法

我想将类似的函数分组。我可以用两种方式之一来实现。对我来说,它们只是语法上的差异......最终并不重要。这种看法准确吗?

命名空间:

namespace util
  {
  void print_array(int array[])
    {
    int count = sizeof( array ) / sizeof( array[0] );
    for (int i = 0; i <= count; i++) cout << array[i];
    }
  }

类:

class Util
  {
  public:
    static void print_array(int array[])
      {
      int count = sizeof(array);
      for (int i = 0; i <= count; i++) cout << array[i];
      }
  };

使用电话通话

Util::print_array()  // Class

或者
util::print_array()  // Namespace

1
我们最近刚刚讨论过这个问题。希望有人能够贴出一个链接。命名空间受到ADL的影响,而类则不是;类可以被模板化,而命名空间则不能。 - Kerrek SB
2个回答

6
第二种方法是愚蠢和完全没有意义的。类不是命名空间,永远不应该被用作命名空间。
此外,代码是错误的,sizeof(array) 不会返回你想要的结果。

类可以作为模板。 - Kerrek SB
2
@KerrekSB:函数也是如此。其好处是部分特化,但如果您了解这一点,就不会问像这样的愚蠢问题。 - Cat Plus Plus
2
“完全胡说八道”的说法似乎有些夸张:如果编译器可以编译它并且它具有预期的效果,那么根据定义它是有意义的。“愚蠢”更具主观性,但您仍然应该支持它。因此,请解释一下为什么您认为不应该以所提议的方式使用类。 - Caleb
1
@JohnDibling:所有成员都是静态的函数对象?这个问题涉及将类视为命名空间,而答案是“不行,使用命名空间”。我认为我们现在已经达成共识,即C++不是Java。(虽然我很累,可能会漏掉什么,但我认为没有比这更高级的概念适用于这个问题。) - Cat Plus Plus
@Cat:如果你是在说“更喜欢使用命名空间”,我原则上同意你的观点。但这不是你实际表达的意思。看起来你是在说“永远不应该使用类作为命名空间结构”。 - John Dibling
我可以想到使用这样的“类”的一个原因,或者至少有一种情况是因为我没有其他想法。具体来说,我曾经在一个头文件中完全定义了几个“类”。我希望它们能够共享一些函数,但我不希望任何人包括那个头文件都能访问这些函数。我的解决方案是将函数作为“静态”和“私有”的放在一个否则为空的类中,然后使其他类成为它的“友元”。 - Joshua Green

3
第二种方式有一些不同,它允许你做一些第一种方式无法做的(荒谬的)事情:
- 使用第二种方式,你可以使用Util foo;Util* foo = new Util();创建Util的实例。 - 你还可以将Util用作模板的类型参数(或任何其他允许类型名称的地方)。所以你可以创建一个vector<Util>。 - 你还可以使用sizeof(Util)计算Util实例的大小。
既然你不想做这些事情,你应该使用第一种方式。通常情况下,在没有任何情况下想要实例化类时,你应该重新考虑是否使用类。
另外一件事:在你的代码中,sizeof(array)等价于sizeof(int*),几乎肯定不会做你想做的事情(即它不能告诉你数组中有多少个元素)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接