鑑於你對情況的描述,我會說使用static const
成員是一個好方法。在C++ 11中,您可能希望將其更改爲static constexpr
以強調它是一個編譯時常量,但不會因此而有效改變。
如果您在代碼中的某處以與one-definition-rule(odr)相關的方式引用myclass::kMyClassContant_
,在需要引用(包括const引用)的上下文中,編譯器會抱怨沒有常量的定義。在這種情況下,僅僅在課堂上聲明和初始化它是不夠的。這可能會迫使你單獨的聲明和定義:
// mycode.h
class myclass {
private:
static const uint16_t kMyClassConstant_;
};
// mycode.cpp
const uint16_t myclass::kMyClassConstant_ = 0xBEEF;
爲了避免維護單獨的聲明和定義的麻煩,有些人喜歡聲明,而不是實際的變量內聯constexpr功能:
// mycode.h
class myclass {
private:
static constexpr uint16_t kMyClassConstant_()
{ return 0xBEEF; }
};
這對於許多與odr有關的問題是一個正確的解決方法,並且不會導致任何性能損失。它是否真的有用取決於維護一個普通靜態常量的單獨聲明和定義的負擔是多少。如果你期望你的常量永遠不會隨着你的代碼的發展而改變,那麼使用具有單獨定義的普通靜態常量是可取的。但是,如果您頻繁修改常量的定義,不得不重新編譯定義文件並將其重新鏈接到項目的所有相關部分,可能會使您認爲上述基於功能的解決方案是更好的選擇。
對數據類型的最終評論:使用std::uint16_t
將其強制爲16位可能會很有用,如果您需要以緊湊形式存儲大量這些值。否則,實際大小可能無關緊要,在這種情況下,std::uint_fast16_t
(可能大於16位)可能會更好。
不,這沒什麼錯。 (希望有些C++專家不需要糾正我:)) – xxbbcc
你可能會在http://codereview.stackexchange.com得到更好的答案。 –
是的,這是一種聲明全局常量的常用方法。 –