【发布时间】:2021-07-18 09:55:42
【问题描述】:
我正在尝试将我们的旧代码从 c++98 重构为 c++14。并且需要使用较旧的 gcc(c++98) 和较新的 gcc(c++14) 进行编译。这就是我们旧代码的样子(这完全是我们复杂代码的示例。这个类的静态常量在另一个类中使用)。
// BankAccount.h
namespace bank {
class BankAccount {
public:
static const unsigned int account_number = 123456789;
static const double balance = 0.0;
BankAccount();
....
};
}
// BankAccount.cpp
namespace bank {
BankAccount::BankAccount() {}
....
}
看起来从 c++11 开始,只有 int 和 enums 只允许在类声明中初始化。
问题:通过像上面那样在类声明中初始化静态 const 变量,是否可以避免静态初始化顺序的失败?看起来像上面的代码,我们从来没有观察到这个静态初始化顺序问题,如果我移动静态双精度并浮动到 .cpp 文件,我应该担心这个问题吗?
【问题讨论】:
-
关于
account_number和balance,您在哪里看到任何订单问题?这两个变量彼此无关。 AFAIK,类成员必须按照声明的顺序进行初始化,但在这种情况下是不管的。当一个静态变量依赖于另一个时(例如,第二个的构造函数取决于构造的第一个),情况会有所不同。 -
顺便说一句。你确定
account_number和balance是static的合适人选吗?我不是。这将导致BankAccount的每个实例将共享相同的成员account_number和balance(具有相同的存储空间)。 (这就是static类变量成员在 C++ 中的含义。)如果是我的银行帐户,我会立即切换到另一家银行... -
@Scheff 这完全是我们复杂代码的示例。一个类的静态常量用于另一个类。
-
@Scheff,我弄错了,它有一个 const 说明符。
标签: c++ c++14 c++98 static-initialization static-order-fiasco