【发布时间】:2011-06-15 18:13:26
【问题描述】:
假设我有
class : foo
{
public:
static const foo Invalidfoo;
foo();
foo(int, string);
private:
int number;
std::string name;
};
它是否安全或容易出现任何问题?
编辑:
我想用它来返回一个无效对象作为启动错误的引用。
【问题讨论】:
假设我有
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 更好,因为它是不可变的。
【讨论】:
这实际上是单例的实现方式,除了你的静态成员将是一个指针。所以是的,你很安全。
【讨论】: