簡體   English   中英

如何在C ++類中定義編譯時(靜態)常量?

[英]How to define compile-time (static) constant inside a C++ class?

我有一些常量只需要在編譯時使用來簡化代碼,所以我不需要在運行時可用的實際變量。

傳統上這樣做的方式是#define NAME 123但我想要一個類型安全的替代品。

在類之外你可以使用const int name = 123; 哪個工作正常,但似乎不可能把它放在一個類。 例如:

class Example {
    public:
        const double usPerSec = 1000000.0;
};
double usOneMinute = 60 * Tempo::usPerSec;

使用Visual C ++,但不適用於GCC:

error: non-static const member ‘const double Example::usPerSec’,
  can’t use default assignment operator

您可以通過使其靜態來修復它,但隨后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'

我猜這意味着VC ++只接受static const int

我想避免在構造函數中設置值,因為我在運行時需要一個類的實例來訪問該值,而實際上我希望它在編譯時都像#define一樣處理。

那么如何將一個常量定義為一個類中的double ,而不是使其成為全局或使用#define ,這將在沒有該類的實例的情況下工作,並且它將與主要的C ++ 03編譯器一起工作?

積分和其他類型之間存在差異。 對於整數類型,您始終可以將它們定義為const static成員,如

struct Example
{
    const static int name = 123;  // added 'static' to code in text of question
    const static unsigned usPerSec = 1000000;
};

對於非整數類型,例如示例中的double ,情況更復雜。 自2011年以來(使用編譯器選項std=c++11與大多數編譯器),您可以簡單地執行此操作:

struct Example
{
    constexpr static double usPerSec = 1000000.0;
};

但是用gcc,這個

struct Example
{
    const static double usPerSec = 1000000.0;
};

應該也適用於C ++ 03(它是一個GNU擴展)。

但是,C ++ 03中的標准方法(也是標准庫本身(例如std::numeric_limits<> ))使用的是static成員函數

struct Example
{
    static double usPerSec() { return 1000000.0; }
};

我看到C ++ 03有兩種可能的方法:

  1. 使用靜態成員函數並依賴於內聯:

     class Example { public: static double usPerSec() { return 1000000.0; } }; double usOneMinute = 60 * Example::usPerSec(); 
  2. 使用靜態數據成員並在常量折疊時退出(使用常量的值將在運行時計算):

     class Example { public: static const double usPerSec; }; double usOneMinute = 60 * Example::usPerSec; // Somewhere in one .cpp const double Example::usPerSec = 1000000.0; 

如果我是你,我會把它放在命名空間中:

namespace MyExampleNamespace {
    const double usPerSec = 1000000.0;
}
double usOneMinute = 60 * MyExampleNamespace::usPerSec;

此代碼適用於vc ++和gcc:

class Example {
public:
    static const double usPerSec ;
};
const double Example::usPerSec=10000.0;
double usOneMinute = 60 * Example::usPerSec;

你必須使它成為靜態const,然后在課外給它值。 不要在構造函數內部執行此操作。 您不必創建make實例

class Example {
public:
    static const double usPerSec;

};

double Example::usPerSec = 1000000.0;

現在您可以在任何地方使用它而無需創建任何類實例

double someVar = Example::usPerSec;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM