之前一直在搞java开发,去年9月份开始,陆陆续续的公司来学校校招了,然后开始忙于校招。后来去了华为,签了约后开始写大论文,所以之后就一直没有更新自己的博客了,有些朋友留言说博主懒惰了,好久都没写博客了~哈哈!现在大论文也差不多了,是时候继续学习了。 由于签了华为,岗位是通信设备软件开发,再加上之前有一周的培训,我估计后面基本上是要做C/C++了,其实我挺喜欢做java的,但是没办法。C++我在三年前看过几个月,仅此而已,现在早忘得差不多了。为了能在5月份入职的时候能够快速上手工作,所以打算接下来的时间好好学习和总结一下C++的东西。 C++和C看起来很像,我觉得叫++C可能会更好,顾名思义,从C拓展而来,兼容C的东西。这篇博文主要来总结一下C++对C都做了哪些拓展,有哪些区别。如果有什么错误,还请博友们指出来,毕竟我还是个C++菜鸟,谢谢!
举个例子,我们都知道,当一个变量定义为const类型后,这个变量的值是不能被改变的,但是在C中,我们可以拐着弯去修改const类型变量的值,如下:
int main(int argc, char *argv[]){ const int a = 100; //a = 200; // error int *p = &a; *p = 200; PRintf("a=%d/n", a); // a=200 return 0;} 对于const类型变量a,我们无法直接再去给它赋值200,但是我们可以定义一个指针变量p来保存a的地址,通过*p
来修改a的值,在C里面这样是可以做到的,这叫明修栈道暗度陈仓。我们再来详细分析一下这个过程,a是个const int
类型,那么取地址后就变成了const int *
类型,也就是说相当于把const int *
类型的变量赋给了int *
类型,把const给干掉了,所以可以对*p
进行赋值了。C中可以随便赋值,这就导致了不严谨。 在C++里,int *p = &a
编译则不会通过,因为无法将const int *
类型的变量赋给了int *
类型,所以既然设定了a为const类型的变量,它就不会让你有修改的机会。C++不喜欢强转,C++会认为你设计有问题。还有个小细节,在定义a的时候,C中可以不赋初值,系统会给一个随机值,而C++中强制你在定义的时候要初始化,这一点在语言的层面上做的就比较友好了。 再举个常见的例子,我们知道malloc函数返回的是void *
类型,在C中,我们可以直接将返回值赋给char *
的变量,但是在C++中,必须转换成char *
类型才可以,如下:
在C语言中是没有bool类型的,C中表示真假用的是0和非0。C++中有bool类型,可以使用true和false来表示真和假。但是在C++中,也可以将0和非0赋给bool类型的变量,这点其实C++做的不太严谨,既然有了bool类型,个人觉得只能用true和false去赋值会更好,可读性也更强。 bool类型其实说白了就是个枚举,C中虽然没有,但是我们可以用枚举来定义这个类型。
#include <stdio.h>typedef enum BOOL{ FALSE,TRUE}Bool;int main(int argc, char *argv[]){ Bool b = FALSE; if(!b) { printf("b value is false/n"); } return 0;} C中必须使用typedef才可以直接使用Bool,否则需要加enum来定义,如enum BOOL b = FALSE;
。在C++中,枚举类型可以直接用来定义变量,不需要再加上enum关键字,也不需要使用typedef来重新命名。
这是什么意思呢?C中的枚举算不上真正的枚举,C 语言中枚举的本质就是整型,枚举变量可以用任意整型来赋值。而C++中枚举变量,只能用被枚举出来的元素去初始化。比如我们定义一个枚举类型:
enum SEASON{ Spring,Summer,Autumn,Winter};在C中我们可以:
enum SEASON s;s = Spring; //oks = 100; //ok但是在C++中:
SEASON s;s = Spring; //oks = 100; //error说个题外话,枚举除了列举一些固定的值以外,还能充当宏的作用。还是上面的例子,如果我们把SEASON去掉,完全可以将枚举中的值作为宏来处理,因为枚举中的值默认是从0开始,也可以手动赋不一样的值,如下:
#include <iostream>enum{ Spring = 100, Summer = 20, Autumn = 50, Winter = 250};int main(int argc, char *argv[]){ printf("%d %d %d %d/n",Spring, Summer, Autumn, Winter); return 0;}这样会将四个值打印出来,可以完美替代宏去操作了,这也是枚举的一个妙用吧。
在C中,表达式是不可以被赋值的,但是在C++中,某些表达式是可以被赋值的。
int main(){ int a, b; a = b = 5; // ok both in c & c++ (a = b) = 100; // ok only in c++ printf("a=%d b=%d/n",a, b); return 0;} 在C中,表达式的值是可以赋值给其他变量的,比如a=b=5;
是将5赋给b,再将表达式b=5的值赋给a,所以a和b都等于5。但是C中不能将100赋值给表达式(a=b),虽然该表达式的值是a的值,但是不允许这样操作,可在C++中是允许的,最后会打印出a=100 b=5。
在C中我们一般用scanf和printf来输入和输出,在C++中使用cin和cout来输入和输出,这两个有啥区别呢?从语言的角度来说,scanf和printf是函数,cin和cout是类对象,他们有相同的功能而已。举个与C对比的例子:
int main(int argc, char *argv[]){ int a = 25; float b = 1234.567; printf("%5d/n%6.2f/n", a, b); cout<<setw(5)<<a<<endl<<setw(6)<<setprecision(2)<<setiosflags(ios::fixed)<<b<<endl; printf("%x/n%o/n%d/n", a, a, a); cout<<hex<<a<<endl<<oct<<a<<endl<<dec<<a<<endl; return 0;}使用setw()函数来设定域宽,使用setprecision和setiosflags来设定小数位。使用hex、oct和dec来表示十六进制、八进制和十进制。关于输入输出后面再细写吧。 当然了,C++对C的扩展远不止这些,今天就先写这么多吧,后面再补充吧~
—–乐于分享,共同进步! —–更多文章请看:http://blog.csdn.net/eson_15
新闻热点
疑难解答
图片精选