C++中的常量界說小結。本站提示廣大學習愛好者:(C++中的常量界說小結)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中的常量界說小結正文
本篇筆記總結自一次代碼檢視。
普通來講,應用C說話編程時我們都習氣在代碼傍邊應用C傍邊的宏界說來界說一個數值常量:
#define MY_CONST 7
在C++開辟項目時,也會常常存在因循C傍邊常量用法情形。所以,以下的一種寫法看起來反倒認為有些不正宗了:
class MyClass { static const int my_const = 7; // ... };
站在編譯器的角度,這兩種寫法都是正當的,但在應用的時刻總得二中擇一,畢竟哪一種更適合呢?之前有所耳聞在C++中應當盡量少的應用C作風的宏界說,這又是為何呢?
在查找一些材料以後發明,關於削減C傍邊的宏界說的重要由於上面幾個緣由:
宏在界說函數的時刻極易輕易失足,這個時刻建議應用inline來替換宏函數。
宏在界說常量的時刻在預處置進程中履行文本調換,在編譯時代不會生成對應的符號,晦氣於調試。所以,在C++傍邊建議應用const或許enum來界說常量。
在C++傍邊界說一個常量有兩種方法,其一是應用static const,別的一種是應用enum。好比:
class MyClass { static const int my_const = 7; enum {another_const = 7}; // ... };
關於這兩種方法,又有一些奶名堂在外面。關於在類傍邊應用const來界說常量時,必需要應用static來潤飾該常量,而且須要在類界說內部對該常量做作聲明。而關於enum來講年夜可不用如斯,所以Bjane Stroustrup在他保護的FAQ傍邊建議應用enum這類方法來界說常量。
總歸來講,在C++傍邊界說in-class常量可以有多種辦法,可行的就有如上提到的三種界說辦法。在編寫公有項目時固然看小我的愛好,想用哪種就用哪種;看成為開辟團隊的一員的時刻遵守團隊提倡的代碼標准顯得更加可取。在這裡小我傾向enum這類界說辦法,同時我會選擇將常量全體年夜寫:)
class MyClass { enum {MY_CONST = 7}; // ... };
我們常在公共頭文件中界說一些常量,界說常量辦法以下:
辦法1
commdef.h(公共頭文件):
const int constname = XXX;
在應用該變量的處所參加 #include "commdef.h"
辦法2
commdef.h(公共頭文件):
extern const int constname;
commdef.cpp文件:
const int constname = XXX;
在應用該變量的處所參加 #include "commdef.h"
因為這兩種方法都編譯運轉沒成績,所以法式員很少留心它們的差別。兩種辦法的比擬:
若添加刪除常量常量,用辦法1更便利,只需在.h文件中修正;若轉變常量值,應用辦法2的法式因不須要改頭文件,則更節儉編譯時光。
若從內存應用上看,哪一種更好?接上去測試看看。
測試法式界說了兩個模塊,test1和test2,test1.cpp和test2.cpp都援用了commdef.h頭文件,應用了全局常量,我們經由過程檢查各個模塊的常量地址來肯定能否另分派了內存。
情況:Windows + vs2005
// commdef.h文件 #ifndef LX_COMMDEF_H #define LX_COMMDEF_H const int MAX_LENGTH = 1024; extern const int MIN_LENGTH; #endif // commdef.cpp文件 #include "commdef.h" const int MIN_LENGTH = 10; // test1.cpp文件(注:頭文件內容因為簡略所以省略失落了) #include "commdef.h" #include "test1.h" #include <iostream> using namespace std; void FuncTest1() { cout << "MAX_LENGTH = " << MAX_LENGTH << ", address: " << &MAX_LENGTH << endl; cout << "MIN_LENGTH = " << MIN_LENGTH << ", address: " << &MIN_LENGTH << endl; } // test2.cpp文件(注:頭文件內容因為簡略所以省略失落了) #include "commdef.h" #include "test1.h" #include <iostream> using namespace std; void FuncTest2() { cout << "MAX_LENGTH = " << MAX_LENGTH << ", address: " << &MAX_LENGTH << endl; cout << "MIN_LENGTH = " << MIN_LENGTH << ", address: " << &MIN_LENGTH << endl; }
輸入:
MAX_LENGTH = 1024, address: 00437AE4
MIN_LENGTH = 10, address: 00437B54
MAX_LENGTH = 1024, address: 00437B1C
MIN_LENGTH = 10, address: 00437B54
可見,用辦法1界說的常量在多個模塊中是分離存儲的,用辦法2界說的常量是在一處存儲的,所以,在存儲上,辦法2要優於辦法1。
特殊是當常量多,頭文件被援用多的情形下特別留意,界說欠妥會帶來不用要的內存糟蹋。
總結:
1. 沒有指定類型
#define不觸及為界說的常量做類型檢討,為了顯式地指定常量類型,須要在常量後加上後綴。好比,關於float類型的常量,在數字前面加上f後綴。
2. 沒有指定感化域
#define界說的常量是全局的。
3. 沒有拜訪掌握
不克不及把#define界說的常量標志為私有的,受掩護的,或許公有的,它實質上是私有的。
由於宏一旦被界說,它就在厥後的編譯進程中有用(除非在某處被#undef)。
4. 沒有符號
後面的例子中,宏MAX_NUM_SIZE能夠會被預處置器從代碼中剝離,如許,編譯器就沒法看見這個名字。如許,法式員在調試時只能看到一些沒有任何描寫性的常量值。