类的静态成员可以与C ++中的成员类相同

时间:2011-06-15 18:13:27

标签: c++ class static

让我说我有

class : foo
{
  public:
  static const foo Invalidfoo;
  foo();
  foo(int, string);
  private:
  int number;
  std::string name;
};

安全或容易出现问题吗?

编辑:

我想使用它来返回一个无效的对象作为启动错误的引用。

6 个答案:

答案 0 :(得分:3)

这是合法的。

它实际上广泛用于singleton pattern

单身人士多线程访问和创建问题。

一篇关于此的好文章:

C++ and the Perils of Double-Checked Locking

答案 1 :(得分:3)

这是完全合法的,但以下情况更好:

class foo:
{
public:
    static const& foo Invalidfoo()
    {
        static foo Invalidfoo_;
        return Invalidfoo_;
    }

private:
      foo();
};

这样可以保证在第一次使用对象时对象进行初始化。

编辑:但无论你怎么做,你仍然有一个全局对象,这可能是问题的原因。最好的解决方案可能是每次需要默认构造对象时调用默认构造函数。在效率方面,差异可能是可以忽略不计的。

答案 2 :(得分:1)

它就像一个全局变量或单例。它容易出现与此相关的问题。

答案 3 :(得分:1)

这是完全有效的代码。它没有任何理由导致任何问题,因为静态数据成员不会对类的大小做出贡献。无论您在一个类中定义了多少个静态数据成员,它的大小都不会改变一个字节!

struct A
{
   int i;
   char c;
};

struct B
{
   int i;
   char c;
   static A a;
   static B b;
};

在上面的代码中,sizeof(A) == sizeof(B)将永远为真。看这个演示:

由C ++标准(2003)的$ 9.4.2 / 1部分支持,

  

静态数据成员不属于   一个类的子对象。 是   只有一份静态数据成员   由所有对象共享   类。

您无法定义封闭类类型的非静态数据成员,因为非静态成员是对象的一部分,因此它们确实有助于类的大小。由于数据成员的递归性质,在计算类的大小时会导致问题。


请参阅此主题:

答案 4 :(得分:0)

这是合法的。从实用/风格的角度来看可怕的代码,但它是合法的,从技术上讲,它可以使其工作。优于Singleton,因为它是不可变的。

答案 5 :(得分:0)

这实际上是如何实现单例,除了静态成员是一个指针。所以,是的,你很安全。