关于常量成员函数(const member function)

如果在一个类声明中,在某个方法的声明最后加上关键字const就表示该方法(函数)已经被声明为常量成员函数(const member function)了。既然叫常量成员函数,也就意味着这种用法(在声明后加上关键字const)只针对某个类的成员函数来使用。

之所以有这样一个需求,初衷是为了防止类成员函数通过this指针来修改this所指向的成员对象。下面来看一个例子:

#include<iostream>
using namespace std;
class test
{
    int value ;
public:
    test(int v =0){value = v;}
    int getValue() const 
    {
        return this->value;
    }
};
int main()
{
    test t(1);
    cout<<t.getValue()<<endl;
    return 0;
}

此时test类中的getValue()方法就是一个常量成员函数,这样在这个函数中,value的值就不能被改变,否则将不能通过。若想改变,去掉后面的关键字即可。由此我们可以知道以下两点:

1.this 是一个常量指针,即this本身是一个常量,不能被修改;
2.this 指向的对象为非常量,在成员函数中可以被修改;若不想被修改,变成常量成员函数即可;

由此遇到的另一个问题:

struct Sales_data
{
    string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;

    string isbn() const {return bookNo;}
    Sales_data& combine(const Sales_data&);
    double avg_price() const;
};

为什么不能把string isbn() const {return bookNo;}的返回类型改为string&?

为什么编译会出错?

返回引用, 就意味着外部调用的时候, 可能对 bookNo 进行修改. 但你又对该成员函数进行了 const 修饰. 这又意味着, 外部调用者无权对该对象进行任何修改. 显然, 这两者是矛盾的. 于是编译器就困惑了…

为什么这儿不能返回引用?

当然可以返回引用, 但你要保证行为遵循逻辑, 如:

std::string& isbn() { return bookNo; } // 返回引用
const std::string& isbn() { return bookNo; } // 返回 const 引用
const std::string& isbn() const { return bookNo; } // 针对 const 对象返回 const 引用

上述三种改法, 都是可以的.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值