C++ 常成员函数、mutable关键字

1. 常函数(只针对普通成员函数)

在这里插入图片描述

  • const属性只针对普通成员函数。构造,析构函数,以及C中的一些全局函数,都是没有const属性的
  • 一旦加上const属性,就不能在成员函数中修改成员变量。如果只希望某个成员函数只是访问成员变量,但不要修改,最好加上const属性。
#include <iostream>
using namespace std;

class A{
public:
    A(int data = 0):m_data(data){}
	// 编译后: void print(const A *this)
    void print(void)const{
        // 这里对成员变量进行了修改,编译会报错
        // 除非给 int m_data 前加 mutable
        cout << m_data++ << endl;
    }

private:
    int m_data;
};

int main(void){
    A a;
    // 通过之前学的this指针,当通过一个对象调用一个成员函数时,会把这个对象的地址当做实参传给成员函数
    // 本例子是非常对象使用常函数。
    // 当中中会有类型转换,即,&a -> this, A* -> const A*这是合法的,相当于缩小了对内存的访问权限.但扩大权限就不合法了
    a.print();  // A::print(&a)
}
$ g++ a.cpp 
a.cpp: In member function ‘void A::print() const’:
a.cpp:10:23: error: increment of member ‘A::m_data’ in read-only object
         cout << m_data++ << endl;

2. mutable关键字

在这里插入图片描述

3. 常函数的应用

在这里插入图片描述

3.1 常函数的使用注意事项

  • 对内存访问的权限缩小,合法。所以非常对象可以调用常函数。
  • 对内存访问的权限扩大,不合法。所以常对象不能调用非常函数。
  • 还有就是常函数里面,不能再调用非常函数,因为常函数中不能修改成员变量,而非常函数中可以修改成员变量。而非常函数中是可以调用常函数的。

3.2 常函数的重载

#include <iostream>
using namespace std;

class A{
public:
    // void func(const A* this)
    void func(void)const{
        cout << "常函数" << endl;
    }
    // void func(A* this)
    void func(void){
        cout << "非常函数" << endl;
    }
};


int main(void){
    A a1;
    a1.func();  // A::func(&a1), 非常函数
    const A a2;
    a2.func();  // A::func(&a2), 常函数
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值