类的静态成员是不是可以与 C++ 中它所属的类具有相同的类型
Posted
技术标签:
【中文标题】类的静态成员是不是可以与 C++ 中它所属的类具有相同的类型【英文标题】:Can a static member of a class as the same type as the class it is member of in C++类的静态成员是否可以与 C++ 中它所属的类具有相同的类型 【发布时间】:2011-06-15 18:13:26 【问题描述】:假设我有
class : foo
public:
static const foo Invalidfoo;
foo();
foo(int, string);
private:
int number;
std::string name;
;
它是否安全或容易出现任何问题?
编辑:
我想用它来返回一个无效对象作为启动错误的引用。
【问题讨论】:
【参考方案1】:这是完全合法的,但以下更好:
class foo:
public:
static const& foo Invalidfoo()
static foo Invalidfoo_;
return Invalidfoo_;
private:
foo();
;
这样可以保证对象在第一次使用时就被初始化。
编辑:但是不管你怎么做,你仍然有一个全局对象,这可能是一个问题的原因。最好的解决方案可能是每次需要默认构造对象时调用默认构造函数。在效率方面,差异可能可以忽略不计。
【讨论】:
【参考方案2】:这是合法的。
其实在singleton pattern中被广泛使用
单例多线程访问和创建问题。
一篇关于这个的好文章:
C++ and the Perils of Double-Checked Locking
【讨论】:
【参考方案3】:它就像一个全局变量或单例。很容易出现与这些相关的问题。
【讨论】:
【参考方案4】:这是完全有效的代码。它没有任何理由引起任何问题,因为静态数据成员不会影响类的大小。无论你在一个类中定义了多少静态数据成员,它的大小都不会改变一个字节!
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 部分支持它,
静态数据成员不属于 一个类的子对象。 有 只有一个静态数据成员的副本 由所有对象共享 类。
您不能定义封闭类类型的非静态数据成员,因为非静态成员是对象的一部分,因此它们确实会影响类的大小。由于数据成员的递归性质,在计算类的大小时会出现问题。
看到这个话题:
How do static member variables affect object size?【讨论】:
【参考方案5】:这是合法的。从实用/风格的角度来看,这是一个糟糕的代码,但它是合法的,而且从技术上讲,它可以工作。比 Singleton 更好,因为它是不可变的。
【讨论】:
【参考方案6】:这实际上是单例的实现方式,除了你的静态成员将是一个指针。所以是的,你很安全。
【讨论】:
以上是关于类的静态成员是不是可以与 C++ 中它所属的类具有相同的类型的主要内容,如果未能解决你的问题,请参考以下文章