const成员函数和非const的成员函数之间的调用
来源:互联网 发布:淘宝上的骑士装备 编辑:程序博客网 时间:2024/05/21 09:44
其实这篇文章有点多余,一般我们不会有这样的需求吧。。其实我这里也是基于一个概念:代码重构。
举个例子:const char& getText(int i) const 和char& getText(int i),看了上一篇文章的人肯定都知道它们,就直接返回对象中一变量的一个值,就一行代码。非常的简单。。但是我们这里假设:如果在这个函数里面有很长的一段代码,那就不知道会冗长多少代码了,此时一般我们的解决办法是:再搞一个private的成员函数,两者再去同时调用这个函数。但是我们这里是不可能的,一个为const的成员函数,不能对对象进行需改,另外一个却完全不同。很明显这样的做法并不符合我们这里的情况。。估计大家看到这里有点发懵。好吧。。我还是来点实际的吧。
const char& getText(int i) const
{
.....
.....
....
reutrn text[i];
}
char& getText(int i)
{
.....
.....
....
reutrn text[i];
}
假如他们上面的代码都是一样的。而且还没有改变这个对象。。此时的重构(降低一半的代码量)就是我们的需求。。这下明白了吧。。
我们已经否决了上面那种常规的办法。。那我们还有什么办法呢?写到这里,我举个不太好的例子,那就是java servlet里面的doget()和doPost()方法,他们有时为了减少代码的编写,往往会在其中的一个方法里面去调用例外一个方法。这就是我们的标题的意思:通过其中的一个函数调用另外一个函数,这不就减少了代码量么?但还是会碰到一个瓶颈,我们之间的const和非const的问题,大家知道:const_cast和static_cast不?这里我们就可以采用这种办法,const_cast是去掉const的,static_cast是加上const的。只需要在一个函数中运用其中一个去调用另外一个函数,比如:在const的函数通过去掉const即加上const_cast前缀,就可以去调用另外非const的函数了。这下就有思路了,不是太难吧。。。
那我们该用哪一个去调用另外一个呢?还是两者都行呢?假如我们用const的函数去调用非const的函数,也就说只要在非const里面的函数实现功能。const函数里面有个特性,那就是不允许修改这个对象的值,然而,非const的成员函数是没有类似这样的限制的,它不会禁止你去改变对象吧?它不会禁止你不去修改对象吧?(,意思是你一定要改变我的值,不改变还不行)。所以得出一个结论:其实两者都行,只是非const调用const的函数更安全一些,而另外一个就改变了人家对象的一个非常重要的属性:const。。所以代码可以这样写:
const char& getText(int i) const
{
.....
.....
....
reutrn text[i];
}
char& getText(int i){
reutrn const_cast(char*)(static_cast<const Test&>(*this)[i]);
}
这样是不是就oK了???
- const成员函数和非const的成员函数之间的调用
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- 类的const和非const成员函数的重载
- const对象调用非const成员函数
- const成员函数和const对象的调用关系
- const成员函数和非const成员函数返回引用的问题
- C++中const成员函数和非const成员函数的重载
- C++中const成员函数和非const成员函数的重载
- C++之类的const成员变量和const成员函数
- const 函数调用类的非const成员函数报错
- 为什么const对象只能调用const成员函数,而不能调用非const成员函数?
- 为什么const对象只能调用const成员函数,而不能调用非const成员函数?
- C++的const类成员函数(解释为什么非const成员函数不能访问const对象的数据成员)
- 类的static成员函数和const成员函数
- Android xml资源文件中@、@android:type、@*、?、@+含义和区别
- HDU 1317 XYZZY Floyd判断能否到达+SPFA判断能否形成环及求最长路(好题)
- windows 下 解决vim乱码
- CentOS 6.3安装VNC报错Could not start Xvnc的解决办法
- note : font operation
- const成员函数和非const的成员函数之间的调用
- codeforces270A
- 栈的原地翻转
- 运算符
- poj 2955 Brackets 【区间DP】
- HDU 1232 并查集
- 跳转(1)
- 最短路--poj2387
- js常用事件整理