C++ 成员函数后面加const的用法,以及mutable关键字

成员函数后加 const

  • 非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编译错误),表示成员函数隐含传入的this指针为const指针,这个函数是不能改变类的成员变量的(因为隐含了对this指针的const引用);唯一的例外是对于mutable修饰的成员。
  • 加了const的成员函数可以被非const对象和const对象调用,但不加const的成员函数只能被非const对象调用。
  • 一般对于不需修改操作的成员函数尽量声明为const成员函数,以防止产生const对象无法调用该成员函数的问题,同时保持逻辑的清晰。
#include <iostream>
using namespace std;

class aa{
    int num;
public:
    aa(){
        int b = 10;
        num = b;
    };
    void out1(){
        cout<<num<<endl;
    }
    void out2() const{
        cout<<num<<endl;
    }
    void out3() const {
        num+=10; //出错,const函数不能修改其数据成员,删掉const可正常编译
        cout<<num<<endl;
    }

};
int main()
{
    aa a1;
    a1.out1();
    a1.out2();
    a1.out3();
    const aa a2;
    // a2.out1(); // 错误,const的成员 不能访问非const的函数
    a2.out2();
    // a2.out3();
    return 0;
}

mutable关键字

关键字mutable是C++中一个不常用的关键字,只能用于类的非静态和非常量数据成员

如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员。但是有些时候需要在该类函数中对类的数据成员进行赋值,这个时候就需要用到mutable关键字了。

#include <iostream>
using namespace std;

class A{
    mutable int num1;
    int num2;
    
public:
    A(): num1(1), num2(2){} // 构造函数,初始化
    void func() const {     // 加了const的成员函数可以被非const对象和const对象调用
        num1 += 10;         // const函数不能修改其数据成员(用mutable修饰的变量除外)
        // num2 += 5;       // 错误
        cout<< num1 <<endl;
    }
    void fun(){
        num1 += 5;
        num2 += 5;
        cout << num1 << endl;
        cout << num2 << endl;
    }

};
int main()
{
    A a1;
    a1.func();      // num1 = 1 + 10
    a1.fun();       // num1 = 11 + 5, num2 = 2 + 5
    const A a2;     // const的成员只能访问加const的函数
    a2.func();      // num1 = 1 + 10
    // a2.fun();    // fun() 未加const,编译错误
    return 0;
}

参考链接:
https://www.cnblogs.com/xing901022/p/3413019.html
https://blog.csdn.net/anye3000/article/details/6618615
https://www.cnblogs.com/llxblogs/p/7709509.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值