静态结构与静态成员

时间:2013-02-20 09:59:23

标签: c++ static struct

今天我发现自己创建了一个2个整数的静态数组,并且因为它在C ++(而不是C ++ 11)中不允许使用内联初始化,所以我还是使用了struct类型的静态变量。

class MyWidget {
  ...
  static const struct Margin {
    const int horizontal = 1;
    const int vertical = 1;
  } margin;

};

我注意到内部变量只对struct Margin的所有实例使用一次,所以我决定将它们设置为静态。

class MyWidget {
  ...
  static const struct Margin {
    static const int horizontal = 1;
    static const int vertical = 1;
  } margin;

};

让我感到奇怪的是,使用静态成员声明静态结构变量与静态结构变量之间的区别。 AFAC静态对象在内存中只分配一次,因此无论我的成员是否为静态,Margin结构都只会被分配一次。

我错过了什么吗?是否存在差异或仅仅是语法糖?

3 个答案:

答案 0 :(得分:11)

你似乎对“静态结构”有点困惑,因为在C ++中,没有静态结构这样的东西(与C#这样的语言相反,静态类是没有全局的事实的解决方法)函数)。

您正在做的是创建该类的实例,并使实例margin)静态(和常量)。所以你的结构不是静态的,你只是定义一个结构,并创建一个属于static const的{​​{1}}实例。现在两个给定例子之间的差异应该是非常明显的。

在第一个示例中,您正在创建一个名为margin的静态变量,属于MyWidget,这意味着您可以像这样访问MyWidget成员

horizontal

MyWidget::margin.horizontal 是您创建的实例。

如果你使结构的成员静态,你将无法做到这一点。相反,你必须像这样访问它们:

margin

其中MyWidget::Margin::horizontal Margin。但请注意,在第二种情况下,不需要静态实例struct,因为它没有与之关联的实例字段。

答案 1 :(得分:6)

确实存在差异:

class MyWidget {
  ...
  static const struct Margin {
    const int horizontal = 1;
    const int vertical = 1;
  } margin;


  void foo() {
    Margin anotherMargin = { 3, 4 };
  }
};

这会创建另一个Margin实例,具有不同的成员。 static中的static const struct Margin {...} margin;适用于变量margin,而不适用于类/结构Margin。这意味着所有MyWidget对象只共享一个Margin对象,但您可以很好地创建具有不同值的其他Margin对象。上面的代码不能编译horizontalvertical本身就是静态的,因为Margin对象没有成员变量(静态不是真正的成员)因此所有Margin对象都会共享{{1 }和horizontal值。

答案 2 :(得分:3)

是的,存在显着差异。在这两种情况下,您声明类型为MyWidget::margin的{​​{1}}并且它们是静态的。在第一种情况下,MyWidget::Margin是一个包含两个字段marginhorizontal的对象。在第二种情况下,vertical是一个没有字段的对象,你可以放弃该对象。

在第一种情况下,您需要使用表单margin(或margin.vertical,如果从外部MyWidget::margin.vertical访问)来访问字段,在第二种情况下,您可以这样做{ {1}}(或MyWidget)。