繁体   English   中英

类的静态成员是否可以与C ++中的成员属于同一类型

[英]Can a static member of a class as the same type as the class it is member of in C++

可以说我有

class : foo
{
  public:
  static const foo Invalidfoo;
  foo();
  foo(int, string);
  private:
  int number;
  std::string name;
};

它安全还是容易出问题?

编辑:

我想用它来返回一个无效的对象作为启动错误的参考。

是合法的

它实际上广泛用于单例模式

单例多线程访问和创建问题。

一篇不错的文章:

C ++和双重检查锁定的风险

这是完全合法的,但是以下更好:

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)将始终为true。 观看此演示:

由C ++ Standard(2003)的$ 9.4.2 / 1部分支持,

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

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


请参阅此主题:

是合法的 从实用/样式的角度来看,这是糟糕的代码,但是它是合法的,并且从技术上讲,它可以正常工作。 比Singleton更好,因为它是不变的。

实际上,这是实现单例的方式,除了您的静态成员是指针。 是的,您很安全。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM