C++ Tips 第一回:那个风情万种的const啊!

2013年一月份在别的地方写的博客,如今搬过来。回头看看,那时候的文风还真是有趣呢~函数


《C++ Primer》这本书带看不看的好多年了。每过一段时间,就拿出来看看。书都折胶了。常看的章节也都泛黄了。可是不少细小可是很重要的点仍然记不住。老是翻看时记得很清楚,可是过一段时间就模糊了。之前老是想把这本厚得跟转头同样的书的要点整理出来,弄成一个很薄很薄的内容。这样每过一段时间就翻出来看看,容易复习。指针

最近想,为什么不整理在微博里呢?这样共享出来,还能给朋友们一块儿看看。固然,看这些内容的人,我但愿你仍是要有点相关知识的基础的。由于我不会从零开始。若是没看过《C++ Primer》,就得本身先看看了。code

好吧,第一次废话比较多。今天我们就聊一聊关键字const对象

const,你们都知道,表示这个量是个常量,不能变化。也就是说,凡是用它修饰的东西,必须在声明的时候给它初始化,否则这个东西(就是常量)就再也没有被改变的机会了。好比:生命周期

const int MAXNUM = 100;

这就代表,MAXNUM在它活在世上这一生里(就是生命周期中),就只能是100了。从生到死,始终心口如一,平静如水,毫无变化。内存

这很简单吧?本来一切都是这么简单,这么美好。可是当const遇到别的东西的时候,一切都开始复杂了,开始让人捉摸不定,让人困惑。就比如人生,本身一我的老是很简单,当你开始恋爱了,有家庭了,有孩子了,一切都变了。就连生活习惯均可能改变了!博客

1、当简单明了的const遇到万恶的指针,注定会产生峰回路转、曲折离奇的爱情故事产品

指针,万恶之源。产品里不少的bug,都是来源于指针。什么指针没释放,致使内存溢出啊;什么指针还须要使用,指向的内存空间就被释放了啊。有人说C++和C难学难用的缘由之一,就是由于要本身管理指针。这话有点道理。it

那么若是const爱上指针,会产生什么呢?可能你们张嘴就能说,固然是“const类型的指针”和“指向const类型的指针”啦!微博

不过,可能令你很惊讶的是:const和指针之间的体位却有三种!看下面的code:

int a = 1;
int b = 2;
int c = 3;
int d = 4;

int const* p1 = &a;
const int* p2 = &b;
int* const p3 = &c;

你可能会想:为何会有三种呢?亲!不是只有两种结果吗?这不是真的,p1p2p3当中必定有一个是错误的结合!

我告诉你,这三种都是他们合法的爱情的结晶。另外,谁告诉你,相同的结果只能有一种表达方式了?好比不管 是西红柿炒鸡蛋,仍是鸡蛋炒西红柿,仍是番茄鸡蛋,这都是同样同样同样的啊!亲!

p1p2实际上是同样的!都是指向const类型的指针,也就是说,不能经过p1p2,来分别改变ab的值。不过,庆幸的是,p1p2在指向一个对象之后,不必定非得一棵树上吊死,它俩还能够指向别的对象。就好像,若是你结婚后对方不能带给你幸福,而本身又没法改变对方。那么,看完这个类型的指针,你就知道了,都什么年代了!你能够离婚去追求本身的幸福啊,亲!

p3const类型的指针。它一旦指向某一个对象,那么这辈子就只能指向它了。正所谓嫁鸡随鸡,嫁狗随狗。忠贞不二!这是中国男人心目中的好老婆。固然,p3也是好指针。当你和一个老外交谈,说到一个比较好的观点时,对方每每会说,good point!什么意思呢?就是good pointer的口语简化,就是“好指针”的意思!

不过,p3若是看对方不爽,能够改变它!此时,个人脑海里浮现出不少别人老婆的光辉形象,好比俞敏洪的老婆啊,李彦宏的老婆啊。这些老婆们,都是good point!

正所谓龙生九子,各有不一样。p1p2p3这哥仨,通过const和指针的杂交,在外形和功能上至少有一方面不一样,那么咱们到底怎么区分呢?

const想成老婆,把int(或者别的变量类型)想成第三者,那么老婆和你站在同一边的,也就是都在* 号右边的,远离第三者的,就是患难与共,荣辱与共,也就是咱们所说的好老婆,就是const类型的指针;而老婆和你在* 号两边的,离第三者总比离你近的呢?就是属于同床异梦的,就是指向const类型的指针。正所谓夫妻本是同林鸟,大难临头各自飞。p1p2的日子很差过啊。

若是我说这么形象你还记不住,那么……记得常喝六个核桃!

2、三个孩子还有故事

简单说说这仨倒霉孩子。

1.孩子们的指向到底有没有问题?

指向const类型的指针,也就是p1p2,通常是用来指向const类型的对象的。这本无可厚非。可是,他们可不能够指向非const类型的对象呢?

答案是:能够滴!

不过,咱们仍然不能经过这类指针去改变他们所指向的对象的值。为何呢?缘由就是p1和p2这哥俩天生就有缺陷。只要让他们指向了,看谁都是const类型的对象!可悲吗?

因此夫妻生活必定要幸福,否则生下来的小孩都不健康哦~

那么,你们很快会想到p3了。const类型的指针呢?const类型的指针能够指向非const类型的对象,可是它坚定不会去指向const类型的对象。由于,它知道,它是要改变对方的,若是对方不向它敞开心扉,它干脆放弃。

顺便说一句,void*指针不能用来指向const类型对象,必须用const void*

2.偶尔有别的东西出来客串,再脑残也是要交朋友的!

再来看看这个code:

typedef int *intPoint;
const intPoint p5;

那么p5究竟是“const类型的指针”仍是“指向const类型的指针”?

你们必定会说p5是“指向const类型的指针”。嗯,可是错了!哈哈!其实人家p5是“const类型的指针”呢~

为何呢?估计你们是内联的展开了intPoint。其实也没错。可是无论怎样,intPoint始终是个指针,那么const修饰指针,那固然是“const类型的指针”啦!

3、还有一个私生子,嘘~能不说就不说吧!

看下面的code:

int d = 4;
const int* const p4 = &d;

这种指针不多露面。通常都隐匿起来。为何呢?由于这个是“指向const类型的const指针”。这类指针,一旦初始化以后,既不能经过它改变指向类型的值,也不能指向别的指针。因此基本上就是个废物,出场率不高。

想一想吧,同时娶两个老婆(const),在新中国已经不容许了!虽然不少男人都想这样……

4、当const为函数打工,小秘和老板之间总有无限引人遐想的故事

一个类里的成员函数,它不想改变类里的任何成员变量。可是它本身没有这个自制力,因此想找人来管管。因而乎,它找到了const。看这一段code,这是一个定义在类Sales_item外面的成员函数,摘自《C++ Primer》第四版:

double Sales_item::avg_price() const 
{ if (units_sold) 
     return revenue/units_sold; 
  else 
     return 0; 
 }

avg_price()没有改变任何的成员变量,事实上,它想改也改不了。一切都在const的严格控制当中。const的限定很是严格,我猜它是处女座的!

固然,咱们只有const成员函数。若是不在类里,就没有const函数。你能够把在类里的函数想象成在体制内的部门。这种部门老是约束这约束那,因此得有const。可是体制外的,社会闲杂人等,不须要什么约束。

5、结束语

说了这么多,有可能有遗漏的。毕竟关于const,老是有说不完的话题。可是基本万变不离其中吧。运用基本知识,解决复杂问题。若是之后真有什么我以为能够补充的,再开博客再详谈吧。

真佩服那些有毅力的人,能从头看到这里。

相关文章
相关标签/搜索