你所不知道的const------C++

来源:互联网 发布:手机淘宝痕迹清理软件 编辑:程序博客网 时间:2024/05/22 12:34

一直对这些东西很感兴趣,但是我们都知道能做项目才是关键,懂这些有个屁用啊。。愿意坚持下去,不管别的人怎么看,那些其他的const的用法,我就不废话了,网上一找一大堆,这里我要说的是一个const 的特性,还有在写代码的时候发现了另外一个有意思的东西。。反正现在在学校也没事,等着找校园招聘啦,所以在这里多写写博客,和大家分享分享。

特性:多态。。(重载)

大家都知道重载是一种静态多态,编译时多态。而这里const所影响的就是重载。。往大的概念上说就是多态委屈

光说没意思,来个代码吧:

#include<iostream>#include<string>using namespace std;class Test{public:Test(string str);virtual ~Test();private:string text;public:const char& getText(int i) const;char& getText(int i) ;};Test::Test(string str){text=str;}Test::~Test(){}const char& Test::getText(int i) const{return text[i];}char& Test::getText(int i) {return text[i+1];}void main(){Test test1("Hello");cout<<test1.getText(0)<<endl;const Test test2("Hello");cout<<test2.getText(0)<<endl;return ;}


代码写的有点乱,找不到好的函数名,下意识的用了get 方法快哭了快哭了

结果:毫无疑问是:e H。不相信你可以自己试试。。

为什么test1(非const对象)就会去调用那个不是const的函数呢?(函数名后面有const的那个函数,不要犯晕认为是修饰返回值的const))。而const对象test2会去调用那个是const的函数呢?

这是不是重载??很明显嘛。。函数名相同,参数列表相同。大家注意如果仅仅是返回值不同,那是会报错的。。

C++这样设计确实还挺不错的,如果你一个const 的对象调用了一个非const的方法,那会出现什么情况呢?const 的对象是不可以改变的,而非const的函数是可以改变对象的。

一个更有意思的东西:在我写代码的时候,我把那个const 的函数的返回值变成了没有const修饰的了,即: 

char& Test::getText(int i) const,它就给我报错了:'return' : cannot convert from 'const char' to 'char &'

大家都知道引用,貌似是别名吧,也还是指向了同一个对象(好久没看了,不知道对不对,反正可以改变那个对象的值)。假如我们这样调用:char& temp=xxx.getText(0),xxx是const对象,那么此时的temp就指向了xxx的那第一个字节,如果我们现在改变了temp的值,那同时也会改变xxx的那第一个字节,而我们的const对象是不可以改变的,这就出问题了。所以编译器就给我们报错了。。所以大家以后注意点就可以了。。原因还是很简单,不要太大意了。。


总结:不要只认为virtual,参数列表那些能给我们多态。。const也是一种,牵强的说法。。平时没人这样说吧。。

原创粉丝点击