嗯,已经是第四篇了,这篇起我就要开始细说语法了,不过在那之前再次申明下主旨:"C++我想这样用" 系列文案是为C程序员打造的,不是C++程序员。
我的终极目标是:让那些觊觎面向对象范式,却又重度强迫症的C脑残粉能够在C++环境下(如C++IDE、C++编译器等)不妥协的,用他们的习惯的C风格,写出他们觊觎很久的带有面向对象的代码。这么啰嗦的话我不想次次都提,但是又怕被不明情况的人乱骂一气,于是我想到了一个词来高度概括上述宗旨-----C with Class!
没错,带类的C,这是C++早期的称呼,但是日渐壮大的C++巨人早就抛弃(背离)了这个乳名,所以我不妨拿来用,我很喜欢这个名字,虽然很多C++程序员用它来鄙视同行的代码,但随他们去吧,因为我又不是他们的同行,我是地地道道的C程序员~~,哈哈!!
我案头摆着的是C++入门神书《Essential C++》,由此进入正题:
第一部分:内建类型&控制流程&基本IO
《Essential C++》第一章中提到的算得上常用的几个数据类型:整型int、实型float double、字符型char、布尔型bool、数组array、字符串string、容器向量vector、指针*
对于C脑残粉来说,指针什么的弱爆了,我要是再啰嗦真的会被灭掉,我只说要注意的:
1.关于布尔类型:在这个系列文章里,C++自带的bool是被禁用的!!原因很简单,我们有C99的<stdbool.h>。什么?你的没有??你不愿意用??好吧,那就继续用你的int代替吧,反正你不会用C++的那个就是了,谁让咱们全是强迫症呢。。。。。。。。。贴出<stdbool.h>的正确用法,你可别弄错了,不然还好意思叫脑残粉?
#include <stdbool.h>
bool b = false;
/* 或者写成_Bool b = false; */
...
b = true;
嗯,进一步解释下,其实_Bool类型是早在stdio.h里就有的,但是没有true和false,然后为了和某++兼容在stdbool.h里,把_Bool宏定义成了bool,把true和false宏定义成了1和0
2.关于string和vector:Essential C++的作者是推荐用这两个东西来彻底代替C的字符串和数组的。没错,如果我是C++程序员,我也会这么做!!但是我是地地道道的Cer,所以在本系列中,这两者同样被禁用!!确实他们很高级,很便利,但是你一点点的贪图这些便利,就会使你逐渐迷失,最后真的变成一个不伦不类的C++程序员!我真的不是开玩笑,凡事莫忘初衷。
3.关于字符常量:这个不好发现,在C里面字符常量是int,但是在C++里面,char就是char,所以导致:
Example
i = sizeof('a');
在C环境下,结果大于1,在C++下结果恒为1。其实如果是比较熟练的C程序员一定知道,由于内存对齐之类的种种原因,sizeof的结果并不总是那么可靠的,我们平时编程要多加小心才是。
说完了类型接着说控制流程,while啊for啊什么的真真是没啥区别的,不然也不要叫C++了!我就不讲怎么用这写弱智的东西了,于是百度半天还真有异常:
4.关于跳转:
Example
goto LABEL;
{
int v = 0;
...
LABEL:
...
}
假设LABEL后的代码是不依赖于局部变量v的,那么上述代码在C里面是合法的,但是在C++里,永远不要企图用goto或switch来跳过块区域内的对象初始化。不过我目前的水平,还没弄出过这么高级的写法,貌似在某些库的源码里真的见识过。。
5.关于IO和重定向:最后说说输入输出吧,作为一个C程序员,有stdio.h搞定不了的I/O吗?printf的效率比不上cout么?看吧,就这样,别去想什么cin和cout了!如果想玩IO重定向什么的,先去研究研究shell把!相信我,那些那你目瞪口呆的小东西没有一个是用cin、cout做的!!
第1部分就到这里了。。。。。再见