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

dcn*_*dcn 29 c++ static

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

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

Jam*_*rty 34

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

namespace utility {
    int helper1();
    void helper2();
};
Run Code Online (Sandbox Code Playgroud)

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

  • 对于那些从Java过渡的人,请注意正确的C++标准术语是"在非成员函数的上下文中(与成员函数相对)".这并不意味着你必须遵循这个术语,但是一些C++程序员(包括我)只有一点点"我们在说什么语言?" 怀疑每次有人谈论C++中的"方法". (8认同)

Naw*_*waz 15

在C++中,只有 static方法的类主要用于模板元编程.

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • Noooo,而不是Fibonacci的例子*再次*!:) (5认同)
  • 我不确定*大多数*是否真的准确,我认为许多程序员使用静态类在逻辑上对一组相关函数进行分组((更好的替代方法是在命名空间中使用自由函数))。但是,您的答案是正确的,因为TMP中广泛使用了静态成员函数。 (2认同)
  • 恐怕您可能高估了全球C ++程序员的技能,但这可能只是我的悲观情绪:)。 (2认同)

Ton*_*ion 7

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

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

  • 我知道一个优势.如果你想让一组函数成为一个类的朋友,那么将它们放在一个类中并且将它们交给类而不是每个单独的函数都更容易和恕我直言.我想到的场景是需要访问私有构造函数的工厂方法等. (2认同)

Dar*_*rda 6

正如许多其他人指出的那样,命名空间内的自由函数是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
    }
};
Run Code Online (Sandbox Code Playgroud)

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

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助。