2011-06-15 39 views

回答

3

这是完全合法的,但下面是更好:

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

private: 
     foo(); 
}; 

这样保证了初始化对象是首次使用这种方式。

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

1

它只是表现得像一个全局变量或单身。这很容易出现与这些问题有关的问题。

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支撑,

静态数据成员不的一部分 一类的子对象。有只有一个副本 类的所有对象共享的静态数据成员 。

您不能定义封装类类型的非静态数据成员,因为非静态成员是对象的部分,这样他们就有助于类的大小。由于数据成员的递归性质,它在计算类的大小时会导致问题。


请参见本主题:

0

这是合法的。从实用/风格的角度来看,代码很糟糕,但它是合法的,在技术上它可以工作。比Singleton更好,因为它是不可变的。

0

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