C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
来源:互联网 发布:黑陶茶具含铅高 知乎 编辑:程序博客网 时间:2024/06/02 07:19
在C++的类定义里面,可以看到类似下面的定义:
01
class
List {
02
private
:
03
Node * p_head;
04
int
length;
05
……
06
Public:
07
int
GetLength ()
const
;
08
bool
GetNodeInfo(
const
int
index,Node & buffer)
const
{…… }
09
bool
DeleteNode(
const
int
index);
10
…………
11
}
可以看到,在GetLength和GetNodeInfo两个成员函数的参数列表后面出现了一个const。这个const指明了这个函数不会修改该类的任何成员数据的值,称为常量成员函数。
对于const函数的外部定义,也不能忘记书写const限定符,如下面给出GetLength函数(指返回链表的长度)的定义:
1
int
List::GetLength()
const
//这里依然不能忘记const
2
{
3
Return length;
4
}
如果在const成员函数的定义中出现了任何修改对象成员数据的现象,都会在编译时被检查出来,如:
1
int
List::GetLength()
const
2
{
3
Return length++;
//错误!
4
}
const成员函数存在的意义在于它能被const常对象调用。我们都知道,在定义一个对象或者一个变量时,如果在类型前加一个const,如const int x;,则表示定义的量为一个常量,它的值不能被修改。但是创建的对象却可以调用成员函数,调用的成员函数很有可能改变对象的值,比如下面这段程序:
1
const
List myList;
2
myList.DeleteNode(3);
//错误,DeleteLength是非const成员函数
显然调用DeleteNode这个成员函数删除一个链表结点后,很有可能改变对象中length(链表长度)这个值,这不符合const对象的规定。但是,如果不允许const对象调用任何成员函数又是非常不合理的。于是,我们把那些肯定不会修改对象的各个属性值的成员函数加上const说明符,这样,在编译时,编译器将对这些const成员函数进行检查,如果确实没有修改对象值的行为,则检验通过。以后,如果一个const常对象调用这些const成员函数的时候,编译器将会允许。比如:
1
const
List myList;
2
myList.GetLength();
//正确,GetLength是const常函数,它返回链表长度,的确没有改变
3
//属性值的行为,被检验通过
你可能会问,为什么不在一个const常对象调用成员函数的时候再进行检查呢?如果被调用的函数会改变对象的属性值,则立即打住就是了。这样就不用麻烦地在成员函数后面加const限定符了。然而,这无疑会大大增加编译时间。考虑下面这段代码:
1
const
List MyList;
2
MyList.GetLength();
3
……
4
MyList.GetLength();
5
……
这段代码中,GetLength被调用了两次,但是编译时却也要检查两次,倘使一个成员函数被调用多次,那么他将在每次调用的时候都会被检查。这显然大大不利。而如果在定义类的时候加上const限定符对常函数加以标记,那么编译器只是检查一次就好,在const对象调用成员函数时,const函数将会被直接放行。所以,C++采取了const限定符描述常函数方案而摈弃了后者。所以,即使一个函数没有修改对象值的行为,如果没有加上const限定符说明是常函数,那么const对象依然不能调用它。
然而,有些时候,我们却必须要让const函数具有修改某个成员数据值的能力。比如一些内部的状态量,对外部用户无所谓,但是对整个对象的运行却大有用处,如支持缓存的技术。遇到这种问题,我们可以把一个成员数据定义为mutable(多变的),它表示这个成员变量可以被const成员函数修改却不违法。比如下面定义了一个is_valid类成员:
01
class
List
02
{
03
private
:
04
……
05
mutable
bool
is_valid;
06
……
07
public
:
08
bool
CheckList()
const
09
{
10
if
(length >= 1) then
return
is_valid =
true
;
11
else
return
is_valid =
false
;
//正确!
12
};
这样,即使像CheckList这样的const成员函数修改它也是合法的。
但需要注意的时,不可滥用mutabe描述符,如果在某个类中只有少数一部分是被允许const常量函数修改的,使用mutable是再合适不过的。如果大部分数据都定义为mutable,那么最好将这些需要修改的数据放入另一个独立的对象里,并间接地访问它。
参考资料:《C++ Programming Language 第三版》
注:本文属知无涯原创,转载请注明出处!
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- C++学习之const成员函数(函数声明后加const,或称常量成员函数)用法详解
- const常量成员函数
- 常量成员函数(const)
- C++中成员函数后加const
- c++const成员函数
- C++ const常量成员函数
- 成员函数后的const
- C++const对象 常量数据 常量成员函数 const指针 const引用
- C++中的const成员函数
- c++中的const 成员函数
- c++ 中的const 成员函数
- linux学习-条件编译和结构体
- 几种查看CentOS系统版本和位数的方法
- 循环·3·求符合给定条件的整数集
- hdu 4347 kdtree kdtree+优先队列
- 基于FBX SDK的FBX模型解析与加载 -(一)
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- 指针问题
- app启动的快速启动的总和案例
- [python 3学习笔记]常用的输入输出
- 基于FBX SDK的FBX模型解析与加载 -(二)
- python时间处理方法datetime(),下面就举几个代码案例进行说明,代码如下:
- 实现一个自己的Validator 注解
- 基于FBX SDK的FBX模型解析与加载 -(三)
- spatiallite空间数据库在Android平台的两种数据查询方式