Const 关键字
我觉得最好的解释是这个
https://docs.microsoft.com/en-us/cpp/cpp/const-cpp?view=msvc-170
- const 变量
如果const变量不是外部(没有extern修饰)的,必须初始化,在C语言中,常量值默认为外部链接,因此它们只能出现在源文件中。在c++中,常量值默认为内部链接,这允许它们出现在头文件中。 - const 函数
这里特别强调类的成员函数,使用const关键字声明成员函数,说明该函数是一个“只读”函数,不会修改调用它的对象。常量成员函数不能修改任何非静态数据成员,除非这个变量加上mutable关键字。也不能调用任何非常量成员函数。要声明常量成员函数,请将const关键字放在实参列表的右括号之后。const关键字在声明和定义中都需要。 - 类内的const成员变量只能使用初始化列表的方式初始化,或者类外初始化,或者加上static,c++11也支持直接在定义的时候初始化,详见
https://light-city.club/sc/basic_content/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
}
- const与指针,分为指向常量的指针(pointer to const)和常量指针(const pointer),前者对应底层const(指针所指的对象是一个常量),后者对应顶层const(指针本身就是常量,所指向的地址一直不变)
- const对象默认为文件局部变量,非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern。
- const对象,和const变量一样不可以修改,除非有成员变量被置为mutable类型
- 对于函数里面的形参,const形参可以接收const和非const类型的实参,例如// i 可以是 int 型或者 const int 型void fun(const int& i){ //…}
上面说的比较细致,下面是精简版的,如果面试问到const的作用,我觉得回答这些就够了,其他都太深了:
- 修饰变量,说明该变量不可以被改变;
- 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);
- 修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;
- 修饰类的成员函数,说明该成员函数内不能修改成员变量。
- 关于类内部的const成员变量,由于类成员变量如果是const,引用,或者属于某种未提供默认构造函数的类类型的话,必须采用初始化列表初始化,这是C++ Primer P259的原话。
参考资料:
https://interview.huihut.com/#/?id=%E2%9E%95-cc
https://interviewguide.cn/