const常量对象与const成员函数调用

今天在写一个类模板的时候遇到了const常量对象与const成员函数调用的问题,仔细捉摸了一番记录下来,简略代码如下:

h文件
class MyVector
{
public:
    MyVector(const MyVector& vec);
    int size();
private:
        int m_num;
};

cpp文件
MyVector::MyVector(const MyVector& vec)
{
    m_num = vec.size();
}

int MyVector::size()
{
    return m_num;
}

编译器报错:error C2662: “MyVector<T>::size”: 不能将“this”指针从“const MyVector<T>”转换为“MyVector<T> &”
简单来说就是不能将一般的this指针指向常量

类的成员函数有一个隐式的指针参数——this,this总是绑定到调用成员函数的对象,所以成员函数size函数实际如下:
int size(MyVector* const this);
但是拷贝构造函数中vec.size()实际为int size(const MyVector* const this),
所以此处实际发生了将MyVector* const this指向了const MyVector* const this,即将常量vec绑定到了指向非常量的this指针
为什么不能这么绑定呢?因为如果可以绑定,那就能通过指针去改变常量的值了,这在C++是不允许的(反向可以),也许C语言可以。
解决办法就是int size()const;

总结:在对对象进行只读操作(获取成员变量的值)时,我们看到常成员函数具有更广泛的适用性,它既能被常量对象调用,又能被非常量对象调用,
而且常量对象只能调用常成员函数(即用const修饰),但是要对对象进行写操作(修改成员变量),就必须使用非常成员函数(不加const修饰)了。
所以如果成员函数只是返回成员变量的值,那最好加const修饰,但是如果是要修改成员变量,坚决不能加const。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值