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了???