今天我发现自己创建了一个2个整数的静态数组,并且因为它在C++(而不是C++ 11)中不允许使用内联初始化,所以我还是使用了struct类型的静态变量.
class MyWidget {
...
static const struct Margin {
const int horizontal = 1;
const int vertical = 1;
} margin;
};
Run Code Online (Sandbox Code Playgroud)
我注意到内部变量只对struct Margin的所有实例使用一次,所以我决定让它们也是静态的.
class MyWidget {
...
static const struct Margin {
static const int horizontal = 1;
static const int vertical = 1;
} margin;
};
Run Code Online (Sandbox Code Playgroud)
让我感到奇怪的是,使用静态成员声明静态结构变量与静态结构变量之间的区别.AFAC静态对象在内存中只分配一次,因此无论我的成员是否为静态,Margin结构都只会被分配一次.
我错过了什么吗?是否存在差异或仅仅是语法糖?
ant*_*ijn 11
你似乎对"静态结构"有点困惑,因为在C++中,没有像静态结构这样的东西(与C#这样的语言相反,其中静态类是没有全局函数的事实的解决方法).
你正在做的是创建该类的实例,并使instance(margin)静态(和常量).所以你的结构不是静态的,你只是定义一个结构,并创建static const它的一个实例,属于MyWidget.现在两个给定例子之间的区别应该是非常明显的.
在第一个示例中,您正在创建一个名为margin的静态变量,属于MyWidget,这意味着您可以horizontal像这样访问该成员
MyWidget::margin.horizontal
Run Code Online (Sandbox Code Playgroud)
margin您创建的实例在哪里.
如果你使结构的成员静态,你将无法做到这一点.相反,您必须像这样访问它们:
MyWidget::Margin::horizontal
Run Code Online (Sandbox Code Playgroud)
哪里Margin是struct.但请注意,在第二种情况下,不需要静态实例margin,因为它没有与之关联的实例字段.
确实存在差异:
class MyWidget {
...
static const struct Margin {
const int horizontal = 1;
const int vertical = 1;
} margin;
void foo() {
Margin anotherMargin = { 3, 4 };
}
};
Run Code Online (Sandbox Code Playgroud)
这创建了另一个Margin实例,具有不同的成员.将static在static const struct Margin {...} margin;适用于变量margin,而不是类/结构Margin.这意味着所有MyWidget对象只共享一个Margin对象,但您可以很好地创建具有不同值的其他Margin对象.上面的代码本身不会编译horizontal并且vertical是静态的,因为Margin对象没有成员变量(静态不是真正的成员),因此所有Margin对象都会共享horizontal和vertical值.
| 归档时间: |
|
| 查看次数: |
29517 次 |
| 最近记录: |