c++中只有静态方法的类的优点

Advantages of classes with only static methods in C++

本文关键字:静态方法 c++      更新时间:2023-10-16

尽管c++中没有静态类,但是从Java背景中,我使用Util创建了一个只包含静态方法的助手类。这是糟糕的风格还是通常的做法?我看到的另一种选择是使用C函数(根本没有类上下文)。还有其他的选择吗?它们的优点和缺点是什么,在什么情况下我会使用它们。

在c++中定义一堆静态方法建议将命名空间静态函数作为一种选择,尽管我没有看到没有类上下文的static关键字有什么影响。

如果您想创建一个实用函数集合而不破坏全局命名空间,您应该只在它们自己的命名空间中创建常规函数:

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

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

在c++中,只有 static方法的类多用于模板元编程。

例如,我想在编译时计算 fibonacci数,而在运行时我希望它们只打印,然后我可以写这个程序:
#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

c++是一种多范式语言,所以如果你需要一些可能根本不适合类的util函数,那么我就把它们变成自由函数。我看不出有什么理由把它们放到类中,仅仅是为了面向对象。

没有优势,我可以看到使所有的函数static和把它们放在一个类,有他们只是作为自由的函数。就个人而言,我认为自由函数是一个更容易使用的选项。

正如许多人指出的那样,在命名空间内使用自由函数是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;
}

如果你不使用模板,就坚持使用名称空间。

在类中声明静态方法没有真正的问题。虽然名称空间更适合这个目的,因为你提到的帖子中提到的原因。

使用C函数可能会产生名称冲突,除非你决定了一个命名约定,用一些东西作为函数的前缀,例如btFunctionA, btFunctionB等。为了避免这种情况,您需要将符号保留在命名空间中,毕竟您使用的是c++而不是C。

名称空间中的静态函数与非静态函数没有任何区别。我相信static关键字在这种情况下是可以忽略的。

在c++中,让它们成为自由函数。根本没有必要或理由把他们放在一个班级里。除非你的模板很烂

这可能与您的兴趣相关。这篇文章考察了Java与其他语言相比实现类和函数的不同方法。

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

还有另一种情况,静态类可能比名称空间更受欢迎:当您希望将数据设为私有,这样就不能从类/名称空间外部直接修改数据,但出于性能原因,您希望使用公共内联函数对其进行操作时。我不认为在命名空间中有任何方法可以做到这一点,除了在命名空间中声明一个类。