问题描述
|
可以说我有
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();
};
这样,可以确保在首次使用该对象时初始化该对象。
编辑:但是,无论如何执行,您仍然有一个全局对象,这可能是问题的原因。最好的解决方案可能是每次需要默认构造对象时都调用默认构造函数。就效率而言,差异可能微不足道。
, 是合法的
它实际上广泛用于单例模式
单例多线程访问和创建问题。
一篇不错的文章:
C ++和双重检查锁定的风险
, 它只是像全局变量或单例。容易出现与此有关的问题。
, 那是完全有效的代码。它没有任何理由引起任何问题,因为静态数据成员不会增加类的大小。无论您在一个类中定义了多少个静态数据成员,它的大小都不会改变一个字节!
struct A
{
int i;
char c;
};
struct B
{
int i;
char c;
static A a;
static B b;
};
在上面的代码中,sizeof(A) == sizeof(B)
将始终为真。观看此演示:
http://www.ideone.com/nsiNL
它由C ++ Standard(2003)的$ 9.4.2 / 1部分支持,
静态数据成员不属于
类的子对象。有
静态数据成员的一个副本
由所有对象共享
类。
您不能定义封闭类类型的非静态数据成员,因为非静态成员是对象的一部分,因此它们确实会增加类的大小。由于数据成员的递归性质,在计算类的大小时会引起问题。
请参阅此主题:
静态成员变量如何影响对象大小?
, 是合法的从实用/样式的角度来看,这是糟糕的代码,但是它是合法的,并且从技术上讲,它可以使代码正常工作。比Singleton更好,因为它是不变的。
, 实际上,这是实现单例的方式,除了您的静态成员是指针。是的,您很安全。