今天我发现自己创建了一个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结构都只会被分配一次。
我错过了什么吗?是否存在差异或仅仅是语法糖?
答案 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对象。上面的代码不能编译horizontal
而vertical
本身就是静态的,因为Margin对象没有成员变量(静态不是真正的成员)因此所有Margin对象都会共享{{1 }和horizontal
值。
答案 2 :(得分:3)
是的,存在显着差异。在这两种情况下,您声明类型为MyWidget::margin
的{{1}}并且它们是静态的。在第一种情况下,MyWidget::Margin
是一个包含两个字段margin
和horizontal
的对象。在第二种情况下,vertical
是一个没有字段的对象,你可以放弃该对象。
在第一种情况下,您需要使用表单margin
(或margin.vertical
,如果从外部MyWidget::margin.vertical
访问)来访问字段,在第二种情况下,您可以这样做{ {1}}(或MyWidget
)。