在C ++中只使用静态方法的类的优点

时间:2011-09-08 09:34:39

标签: c++ static

即使有来自Java背景的no static classes in C++,我也会创建一个像Util这样只包含静态方法的辅助类。这被认为是糟糕的风格还是通常的做法?我看到的一个替代方案是使用C函数(根本没有类上下文)。有什么其他选择吗?有什么优点和缺点,在哪种情况下我会使用其中任何一种。

defining bunch of static methods in c++建议使用命名空间静态函数作为一种替代方法,但我没有看到没有类上下文的static关键字有什么影响。

8 个答案:

答案 0 :(得分:31)

如果要在不破坏全局命名空间的情况下创建实用程序函数集合,则应该只在自己的命名空间中创建常规函数:

namespace utility {
    int helper1();
    void helper2();
};

您可能也不想让它们成为静态函数。 在非成员函数的上下文中(与成员函数相反),C和C ++中的static关键字只是将函数的范围限制为当前源文件(也就是说,它使函数对于私有函数而言是私有的。当前文件)。它通常仅用于实现由C编写的库代码使用的内部辅助函数,因此生成的辅助函数没有暴露给其他程序的符号。这对于防止名称之间的冲突非常重要,因为C没有名称空间。

答案 1 :(得分:13)

在C ++中,仅使用 static方法的类主要用于模板元编程。

例如,我想在编译时本身计算斐波纳契数,并且在运行时我希望它们只打印,然后我可以编写这个程序:< / p>

#include <iostream>

template<int N>
struct Fibonacci 
{
   static const int value = Fibonacci<N-1>::value + Fibonacci<N-2>::value;
   static void print()
   {
       Fibonacci<N-1>::print();
       std::cout << value << std::endl;
   }
};


template<>
struct Fibonacci<0>
{
   static const int value = 0;
   static void print()
   {
       std::cout << value << std::endl;
   }
};

template<>
struct Fibonacci<1>
{
   static const int value = 1;
   static void print()
   {
       Fibonacci<0>::print();
       std::cout << value << std::endl; 
   }
};

int main() {
        Fibonacci<20>::print(); //print first 20 finonacci numbers
        return 0;
}

在线演示:http://www.ideone.com/oH79u

答案 2 :(得分:6)

C ++是一种多范式语言,所以如果你需要一些可能根本不适合某个类的util函数,那么我只能让它们成为自由函数。我没有理由将它们放入课堂,只是为了OOP的缘故。

我可以看到制作所有函数static并将它们放在一个类中,而不是将它们作为自由函数。就个人而言,我认为免费功能更容易使用。

答案 3 :(得分:2)

正如许多其他人所指出的那样,名称空间中的自由函数是c++中常见的一种方法。

我要为具有所有静态函数的类创建的一种情况是,当您希望将一组函数公开给从模板参数派生的信息时,即

template <typename Ty>
    class utils
{
public :
// if you need to setup a bunch of secondary types, based on "Ty" that will be used 
// by your utility functions
    struct item_type
    { 
        Ty data;
        // etc
    }; 

// a set of utilities
    static void foo(Ty &data1, item_type &item)
    { 
        // etc
    }
};

您可以使用它来实现模板命名空间的效果:

int main ()
{
    double data;
    utils<double>::item_type item ;
    utils<double>::foo(data, item);

    return 0;
}

如果您不使用模板,请坚持使用名称空间。

希望这有帮助。

答案 4 :(得分:1)

这可能与您的兴趣相关。这是一篇文章,与其他语言相比,它检查了Java中类和函数的不同方法。

http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html

答案 5 :(得分:1)

在类中声明静态方法没有真正的问题。尽管由于您所指的帖子中提到的原因,名称空间更适合此目的。

使用C函数可以生成名称冲突,除非您决定命名约定,为函数添加前缀,例如btFunctionA,btFunctionB等。 您需要将符号保留在命名空间中以避免这种情况,您使用的是C ++而不是C语言。

命名空间中的静态函数与非静态函数没有任何不同。我相信在这种情况下只会忽略static关键字。

答案 6 :(得分:1)

在C ++中,只需使它们成为自由函数即可。根本没有必要或没有理由将它们放在课堂上。除非你正在使用模板进行调整。

答案 7 :(得分:0)

在另一种情况下,静态类可能比命名空间更可取:当您想要将数据设为私有数据,以便不能从类/命名空间外部直接修改数据时,出于性能原因,您想要具有公开的内联功能。除了在名称空间中声明一个类外,我认为没有任何其他方法可以使用名称空间。