declarator
:
ptr-declarator
noptr-declarator
parameters-and-qualifiers
trailing-return-type
ptr-declarator
:
noptr-declarator
ptr-operator
ptr-declarator
noptr-declarator
:
declarator-id
attribute-specifier-seq
opt
noptr-declarator
parameters-and-qualifiers
noptr-declarator
[
constant-expression
opt
]
attribute-specifier-seq
opt
(
ptr-declarator
)
parameters-and-qualifiers
:
(
parameter-declaration-clause
)
cv-qualifier-seq
opt
ref-qualifier
opt
noexcept-specifier
opt
attribute-specifier-seq
opt
trailing-return-type
:
->
type-id
ptr-operator
:
*
attribute-specifier-seq
opt
cv-qualifier-seq
opt
&
attribute-specifier-seq
opt
&&
attribute-specifier-seq
opt
nested-name-specifier
*
attribute-specifier-seq
opt
cv-qualifier-seq
opt
cv-qualifier-seq
:
cv-qualifier
cv-qualifier-seq
opt
cv-qualifier
:
const
volatile
ref-qualifier
:
declarator-id
:
...
opt
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
的詳細資訊,請參閱下列文章:
const
和 volatile
指標
型別限定詞 (C 語言參考)
volatile
#define