类的静态成员是不是可以与 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) 将始终为真。看这个演示:

http://www.ideone.com/nsiNL

C++ 标准 (2003) 中的 $9.4.2/1 部分支持它,

静态数据成员不属于 一个类的子对象。 有 只有一个静态数据成员的副本 由所有对象共享 类。

您不能定义封闭类类型的非静态数据成员,因为非静态成员是对象的一部分,因此它们确实会影响类的大小。由于数据成员的递归性质,在计算类的大小时会出现问题。


看到这个话题:

How do static member variables affect object size?

【讨论】:

【参考方案5】:

这是合法的。从实用/风格的角度来看,这是一个糟糕的代码,但它是合法的,而且从技术上讲,它可以工作。比 Singleton 更好,因为它是不可变的。

【讨论】:

【参考方案6】:

这实际上是单例的实现方式,除了你的静态成员将是一个指针。所以是的,你很安全。

【讨论】:

以上是关于类的静态成员是不是可以与 C++ 中它所属的类具有相同的类型的主要内容,如果未能解决你的问题,请参考以下文章

静态对象成员会在所属类的析构函数被调用时自动析构吗?

动态加载的类的静态成员变量

反射机制

C++ (P70—)

C++类的大小计算汇总

Friend函数访问静态库中定义的类的私有成员