让我说我有
class : foo
{
public:
static const foo Invalidfoo;
foo();
foo(int, string);
private:
int number;
std::string name;
};
安全或容易出现问题吗?
编辑:
我想使用它来返回一个无效的对象作为启动错误的引用。
答案 0 :(得分:3)
答案 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)
这实际上是如何实现单例,除了静态成员是一个指针。所以,是的,你很安全。