能否一类的静态成员为同一类型作为类是成员的C++
问题描述:
class : foo
{
public:
static const foo Invalidfoo;
foo();
foo(int, string);
private:
int number;
std::string name;
};
它是安全的或容易出现什么问题?
编辑:
我想用这个有一个无效的对象返回为发动错误的引用。
答
这是完全合法的,但下面是更好:
class foo:
{
public:
static const& foo Invalidfoo()
{
static foo Invalidfoo_;
return Invalidfoo_;
}
private:
foo();
};
这样保证了初始化对象是首次使用这种方式。
编辑:但不管你怎么做,你仍然有一个全局对象,这可能是一个问题的原因。最好的解决方案可能是每次需要默认构造对象时调用默认构造函数。在效率方面,差别可能是可以忽略的。
答
它只是表现得像一个全局变量或单身。这很容易出现与这些问题有关的问题。
答
这是完全有效的代码。它没有任何理由导致任何问题,因为静态数据成员不会影响类的大小。无论你在一个类中定义多少个静态数据成员,它的大小都不会改变一个字节!
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支撑,
静态数据成员不的一部分 一类的子对象。有是 只有一个副本 类的所有对象共享的静态数据成员 。
您不能定义封装类类型的非静态数据成员,因为非静态成员是对象的部分,这样他们就有助于类的大小。由于数据成员的递归性质,它在计算类的大小时会导致问题。
请参见本主题:
答
这是合法的。从实用/风格的角度来看,代码很糟糕,但它是合法的,在技术上它可以工作。比Singleton更好,因为它是不可变的。
答
这实际上是如何实现一个单例,除了你的静态成员将是一个指针。所以是的,你很安全。