當它修改數據宣告時, const 關鍵詞會指定物件或變數不可修改。
語法
declarator:
ptr-declarator
noptr-declaratorparameters-and-qualifierstrailing-return-type
ptr-declarator:
noptr-declarator
ptr-operatorptr-declarator
noptr-declarator:
declarator-idattribute-specifier-seq選擇
noptr-declaratorparameters-and-qualifiers
noptr-declarator[constant-expression選擇]attribute-specifier-seq選擇
(ptr-declarator)
parameters-and-qualifiers:
(parameter-declaration-clause)cv-qualifier-seq選擇
ref-qualifier選擇noexcept-specifier選擇attribute-specifier-seq選擇
trailing-return-type:
->type-id
ptr-operator:
*attribute-specifier-seq選擇cv-qualifier-seq選擇
&attribute-specifier-seq選擇
&&attribute-specifier-seq選擇
nested-name-specifier*attribute-specifier-seq選擇cv-qualifier-seq選擇
cv-qualifier-seq:
cv-qualifiercv-qualifier-seq選擇
cv-qualifier:
const
volatile
ref-qualifier:
&
&&
declarator-id:
...選擇id-expression
const 值
const關鍵詞會指定變數的值是常數,並告訴編譯程式防止程序設計人員修改它。
// constant_values1.cpp
int main() {
const int i = 5;
i = 10; // C3892
i++; // C2105
}
在C++中,您可以使用 const 關鍵詞,而不是 #define 預處理器指示詞來定義常數值。 定義的 const 值受限於型別檢查,而且可用來取代常數表達式。 在C++中,您可以使用變數指定陣列 const 的大小,如下所示:
// constant_values2.cpp
// compile with: /c
const int maxarray = 255;
char store_char[maxarray]; // allowed in C++; not allowed in C
在 C 中,常數值預設為外部連結,因此它們只能出現在原始程式檔中。 在 C++ 中,常數值預設為內部連結,讓它們出現在頭檔中。
關鍵詞 const 也可以在指標宣告中使用。
// constant_values3.cpp
int main() {
char this_char{'a'}, that_char{'b'};
char *mybuf = &this_char, *yourbuf = &that_char;
char *const aptr = mybuf;
*aptr = 'c'; // OK
aptr = yourbuf; // C3892
}
宣告為 const 的變數指標只能指派給也宣告為 const的指標。
// constant_values4.cpp
#include <stdio.h>
int main() {
const char *mybuf = "test";
char *yourbuf = "test2";
printf_s("%s\n", mybuf);
const char *bptr = mybuf; // Pointer to constant data
printf_s("%s\n", bptr);
// *bptr = 'a'; // Error
}
您可以使用常數數據的指標做為函式參數,以防止函式修改透過指標傳遞的參數。
對於宣告為 const的物件,您只能呼叫常數成員函式。 編譯程式可確保永遠不會修改常數物件。
birthday.getMonth(); // Okay
birthday.setMonth( 4 ); // Error
您可以呼叫非常數物件的常數或非常數成員函式。 您也可以使用 const 關鍵詞多載成員函式;此功能允許針對常數和非常數物件呼叫不同版本的函式。
您無法使用 const 關鍵詞宣告建構函式或解構函式。
const 成員函式
使用 const 關鍵詞宣告成員函式會指定函式是「只讀」函式,不會修改其呼叫的物件。 常數成員函式無法修改任何非靜態數據成員,或呼叫任何非常數的成員函式。 若要宣告常數成員函式,請將 const 關鍵詞放在自變數清單的右括號後面。 宣告 const 和定義都需要 關鍵詞。
// constant_member_function.cpp
class Date
{
public:
Date( int mn, int dy, int yr );
int getMonth() const; // A read-only function
void setMonth( int mn ); // A write function; can't be const
private:
int month;
};
int Date::getMonth() const
{
return month; // Doesn't modify anything
}
void Date::setMonth( int mn )
{
month = mn; // Modifies data member
}
int main()
{
Date MyDate( 7, 4, 1998 );
const Date BirthDate( 1, 18, 1953 );
MyDate.setMonth( 4 ); // Okay
BirthDate.getMonth(); // Okay
BirthDate.setMonth( 4 ); // C2662 Error
}
C 和C++ const 差異
當您在 C 原始碼檔案中定義 const 變數時,請執行如下動作:
const int i = 2;
接著,您可以在另一個模組中使用這個變數,如下所示:
extern const int i;
但是若要在 C++中取得相同的行為,您必須將變數定義為 const :
extern const int i = 2;
與 C 類似,您可以在另一個模組中使用這個變數,如下所示:
extern const int i;
如果您想要在C++原始碼檔案中定義 extern 變數,以用於 C 原始程式碼檔,請使用:
extern "C" const int x=10;
以防止C++編譯程序的名稱管理。
備註
遵循成員函式的參數清單時, const 關鍵詞會指定函式不會修改其叫用的物件。
如需 的詳細資訊 const,請參閱下列文章: