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++难,其实这就是难点之一。
- C++中,经常有同名成员函数,一个const形式一个非const形式的解读
- const成员函数的一个应用实例
- C++中const成员函数和非const成员函数的重载
- C++中const成员函数和非const成员函数的重载
- 在const和非const成员函数中避免重复
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 一个使用mutable修改const成员函数的栗子
- c++const成员函数
- const对象调用非const成员函数
- 一个数的二进制形式中有几个1
- 求出一个数的二进制形式中有几个1
- c/c++中const成员函数的返回值类型
- C语言中—— 编写一个函数,实现整数的二进制的形式
- 【HDU】 1999 不可摸数
- 动态规划--随笔(个人理解)
- NOIP2012 D2 T2 借教室 线段树 OR 二分法
- 写JQuery插件的基本知识
- Xampp套件中apache及php升级介绍
- C++中,经常有同名成员函数,一个const形式一个非const形式的解读
- 基于huffman压缩的课程设计
- Hadoop异常合集(更新中~)
- 《HTTP权威指南》——认证机制
- First Blog
- hdu 5162(概率期望)
- mysql 存储过程的权限问题 java.sql.SQLException: The user specified as a definer ('xxxx'@'%') does not exist
- block引用外部变量(三)
- 学习计划