C++里的const关键字的作用,详细的解释

Const 关键字
我觉得最好的解释是这个
https://docs.microsoft.com/en-us/cpp/cpp/const-cpp?view=msvc-170

  1. const 变量
    如果const变量不是外部(没有extern修饰)的,必须初始化,在C语言中,常量值默认为外部链接,因此它们只能出现在源文件中。在c++中,常量值默认为内部链接,这允许它们出现在头文件中。
  2. const 函数
    这里特别强调类的成员函数,使用const关键字声明成员函数,说明该函数是一个“只读”函数,不会修改调用它的对象。常量成员函数不能修改任何非静态数据成员,除非这个变量加上mutable关键字。也不能调用任何非常量成员函数。要声明常量成员函数,请将const关键字放在实参列表的右括号之后。const关键字在声明和定义中都需要。
  3. 类内的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
}
  1. const与指针,分为指向常量的指针(pointer to const)和常量指针(const pointer),前者对应底层const(指针所指的对象是一个常量),后者对应顶层const(指针本身就是常量,所指向的地址一直不变)
  2. const对象默认为文件局部变量,非const变量默认为extern。要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern。
  3. const对象,和const变量一样不可以修改,除非有成员变量被置为mutable类型
  4. 对于函数里面的形参,const形参可以接收const和非const类型的实参,例如// i 可以是 int 型或者 const int 型void fun(const int& i){ //…}

上面说的比较细致,下面是精简版的,如果面试问到const的作用,我觉得回答这些就够了,其他都太深了:

  1. 修饰变量,说明该变量不可以被改变;
  2. 修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);
  3. 修饰引用,指向常量的引用(reference to const),用于形参类型,即避免了拷贝,又避免了函数对值的修改;
  4. 修饰类的成员函数,说明该成员函数内不能修改成员变量。
  5. 关于类内部的const成员变量,由于类成员变量如果是const,引用,或者属于某种未提供默认构造函数的类类型的话,必须采用初始化列表初始化,这是C++ Primer P259的原话。

参考资料:
https://interview.huihut.com/#/?id=%E2%9E%95-cc
https://interviewguide.cn/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值