【C/C++】C++对C的扩展总结

  之前一直在搞java开发,去年9月份开始,陆陆续续的公司来学校校招了,然后开始忙于校招。后来去了华为,签了约后开始写大论文,所以之后就一直没有更新自己的博客了,有些朋友留言说博主懒惰了,好久都没写博客了~哈哈!现在大论文也差不多了,是时候继续学习了。
  由于签了华为,岗位是通信设备软件开发,再加上之前有一周的培训,我估计后面基本上是要做C/C++了,其实我挺喜欢做java的,但是没办法。C++我在三年前看过几个月,仅此而已,现在早忘得差不多了。为了能在5月份入职的时候能够快速上手工作,所以打算接下来的时间好好学习和总结一下C++的东西。
  C++和C看起来很像,我觉得叫++C可能会更好,顾名思义,从C拓展而来,兼容C的东西。这篇博文主要来总结一下C++对C都做了哪些拓展,有哪些区别。如果有什么错误,还请博友们指出来,毕竟我还是个C++菜鸟,谢谢!

1. 类型检查更严格

  举个例子,我们都知道,当一个变量定义为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 *类型才可以,如下:

char *p = malloc(100); // C
char *p = (char *)malloc(100); // C++

2. 增加bool类型

  在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来重新命名。

3. 真正的枚举

  这是什么意思呢?C中的枚举算不上真正的枚举,C 语言中枚举的本质就是整型,枚举变量可以用任意整型来赋值。而C++中枚举变量,只能用被枚举出来的元素去初始化。比如我们定义一个枚举类型:

enum SEASON
{
    Spring,Summer,Autumn,Winter
};

在C中我们可以:

enum SEASON s;
s = Spring; //ok
s = 100; //ok

但是在C++中:

SEASON s;
s = Spring; //ok
s = 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;
}

这样会将四个值打印出来,可以完美替代宏去操作了,这也是枚举的一个妙用吧。

4. 表达式可以被赋值

在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。

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的扩展远不止这些,今天就先写这么多吧,后面再补充吧~

微信公众号:程序员私房菜(关注有惊喜~)
程序员私房菜
【友情提示】.我的 Spring Boot 达人课上线了,您的支持是我创作的最大动力!
扫码试读或点此试读
这里写图片描述


—–乐于分享,共同进步!
—–更多文章请看:http://blog.csdn.net/eson_15

阅读更多
版权声明:尊重博主原创文章,转载请注明出处 https://blog.csdn.net/eson_15/article/details/55095002
文章标签: C C++ 编程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭