C++中,经常有同名成员函数,一个const形式一个非const形式的解读

来源:互联网 发布:二进制是谁发明的 知乎 编辑:程序博客网 时间:2024/04/25 13:19

C++中,我们经常看到STL有同名成员函数,一个const形式一个非const形式的,而且实现都是完全相同的,为什么呢?我们简单来分析一下,看看下面的代码,来源于C++中STL string class的片段:

reference at(size_type _Off)
{ // subscript mutable sequence with checking
if (this->_Mysize <= _Off)
_Xran(); // _Off off end
return (this->_Myptr()[_Off]);
}


const_reference at(size_type _Off) const
{ // subscript nonmutable sequence with checking
if (this->_Mysize <= _Off)
_Xran(); // _Off off end
return (this->_Myptr()[_Off]);
}

以上成员函数at有两个形式,一个非const和一个const形式,而且实现完全一样,从访问权限上来讲,我们完全可以只有const形式的成员函数,因为const成员函数当对象为const对象和非const对象的时候都可以调用const成员函数,所以一般情况下,我们提供const形式的成员函数即可(注意:成员函数是否应该是const成员函数,首先应该考虑的是函数本身要表达的意义,根据函数的意义来决定是否应该为const成员函数),特别注意了,这里为什么要提供两种形式的成员函数,主要原因是函数返回了一个元素的引用对象,当我们外部对象定义为const对象的时候,编译器则会自动使用const形式的成员函数,而且const成员函数的返回值必须为const_reference,这里的必须不是强制的,而是说根据上下文来的,既然我们的外部对象都已经是const的对象了,那么我们期望const对象的元素肯定也是不能访问的。所以在这里设计两个成员函数,主要是分表为非const对象和const对象服务的,只设计任何一个都无法满足全部需求。const成员函数虽然能让const对象和非const外部对象都访问,但是他的返回值为const_reference,却不是我们期望的,因为我们的非const对象我们是期望它能修改的其中元素的,而返回了const_reference类型,又无法修改元素。大家又说,我们把const成员函数的返回值改为reference呢?是的,这样也会有问题,因为我们的外部对象如果是const对象,说明我们是不期望它被修改的,但是const成员函数的返回值又是reference,让我们又可以修改它的元素,这又是矛盾的了,所以,综合上面讲的,有一个原则:如果成员函数需要返回引用类型,那么设计两个相同的成员函数,一个const一个非const才是合理的。C++本身是很强调权限控制的,而我们的设计也需要去控制访问并符合逻辑,我想这才是好的设计,大家都说C++难,其实这就是难点之一。

1 0
原创粉丝点击