您的位置:首页 > 编程语言 > C语言/C++

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

2013-08-13 18:20 155 查看
一直对这些东西很感兴趣,但是我们都知道能做项目才是关键,懂这些有个屁用啊。。愿意坚持下去,不管别的人怎么看,那些其他的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也是一种,牵强的说法。。平时没人这样说吧。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息