今天在写一个类模板的时候遇到了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。