可以在c ++中将类声明为static吗?

10 c++ static

这在c ++中是否合法(是的,我知道它在.net中是合法的),如果是,那么它将如何/为什么会被使用?

static class foo{  
    public:  
        foo();  
        int doIt(int a);   
};
Run Code Online (Sandbox Code Playgroud)

Ðаn*_*Ðаn 27

如果您使用的是C++/CLI,则实际的语法static

ref class Foo abstract sealed /* abstract sealed = C# static */
{
};
Run Code Online (Sandbox Code Playgroud)


Ada*_*ras 22

不,这在C++中不受支持.static说明者在.NET中唯一做的就是强迫你让所有的类成员都是静态的; 它只是一个帮助关键字.要在C++中编写静态类,您需要做的就是确保将类中的每个成员标记为static.(编辑:和非公共构造函数,因此无法实例化您的"静态"类.)

  • 通常,这将在命名空间中. (4认同)
  • 有些情况下,你把它作为一个类.例如,在模板中用作策略. (4认同)
  • 您还需要一个非公共(理想的私有)构造函数. (2认同)
  • 这个答案是对的.C#`static`关键字添加了使类'abstract`和`sealed`的元数据,因此即使您使用该类引用程序集,也无法实例化该类或从中派生它. (2认同)

Phi*_*gan 8

C++中最接近的静态类是一个只有静态成员变量的类.这被称为单稳态模式.这样的类意味着该类的所有实例都具有相同的状态.monostate实例的用法语法类似于普通类(与单例类不同),实际上monostate类可以转换为常规类而不改变其任何用法.例如

// Monostate class
public class Administrator
{
  private:
    static int _userId;
  public
    int UserId() { return _userId; }
}

// Initializing the monostate value
int Administrator::_userId = 42;

// Using an instance of a monostate class
void Foo()
{
    Administrator admin = new Administrator();
    Assert.Equals( 42, admin.UserId() );   // will always be 42 
}
Run Code Online (Sandbox Code Playgroud)


Ken*_*oom 7

staticC++中文件级作用域的修饰符表示标记的标识符static仅在定义它的文件中可见.这种语法在类(仅方法和变量)中不可用,但是对于使用匿名命名空间的类可以获得类似的效果:

namespace{
  class Foo{};
};
Run Code Online (Sandbox Code Playgroud)