Mal*_*ous 5 c++ const class class-variables
我有一些常量只需要在编译时使用来简化代码,所以我不需要在运行时可用的实际变量.
传统上这样做的方式是,#define NAME 123但我想要一个类型安全的替代品.
在课程之外你可以const int name = 123;正常工作,但似乎不可能把它放在一个类中.例如:
class Example {
public:
const double usPerSec = 1000000.0;
};
double usOneMinute = 60 * Tempo::usPerSec;
Run Code Online (Sandbox Code Playgroud)
使用Visual C++,但不适用于GCC:
error: non-static const member ‘const double Example::usPerSec’,
can’t use default assignment operator
Run Code Online (Sandbox Code Playgroud)
您可以通过使其静态来修复它,但随后Visual C++抱怨:
error C2864: 'Example::usPerSec' : a static data member with an in-class
initializer must have non-volatile const integral type
type is 'const double'
Run Code Online (Sandbox Code Playgroud)
我猜这意味着VC++只会接受static const int.
我想避免在构造函数中设置值,因为我在运行时需要一个类的实例来访问该值,而实际上我希望它在编译时像处理它一样处理#define.
那么如何将一个常量定义为double类的内部,而不是使其成为全局或使用#define,这将在没有类的实例的情况下工作,并且将与主要的C++ 03编译器一起工作?
Wal*_*ter 10
积分和其他类型之间存在差异.对于整数类型,您始终可以将它们定义为const static成员
struct Example
{
const static int name = 123; // added 'static' to code in text of question
const static unsigned usPerSec = 1000000;
};
Run Code Online (Sandbox Code Playgroud)
对于非整数类型,例如double在您的示例中,情况更复杂.自2011年以来(使用std=c++11大多数编译器的编译器选项),您可以简单地执行此操作:
struct Example
{
constexpr static double usPerSec = 1000000.0;
};
Run Code Online (Sandbox Code Playgroud)
但是用gcc,这个
struct Example
{
const static double usPerSec = 1000000.0;
};
Run Code Online (Sandbox Code Playgroud)
应该也适用于C++ 03(它是一个GNU扩展).
但是,C++ 03中的标准方法(也是标准库本身(例如in std::numeric_limits<>))使用的是static成员函数
struct Example
{
static double usPerSec() { return 1000000.0; }
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4919 次 |
| 最近记录: |