当它修改数据声明时, 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,请参阅以下文章: