• 第2课 C到C++的升级


      C与C++的关系:

    C++在C语言的基础上进行的升级最重要的是两个方面:

      1、类型的加强,C++更称得上是高级语言,C++语言对于类型的检查更严格

      2、面向对象的支持,天生支持面向对象软件开发方法学

    C++语言是C语言的进化。

    C++语言更强调语言的实用性,有一些语法方面的加强

      所有变量都可以在需要使用时再定义

    而C语言中的变量必须在作用域开始的位置定义(老的C语言版本)

    register关键字:

      register关键字在C语言中很鸡肋,编译器发展到后期,优化能力很强。C++虽然依旧支持register,这仅仅是为了兼容C语言。C++有自己的优化方式,基本不看是否存在regster关键字。register在C++中形同虚设。

      C++中的register关键字:

      

    在C语言中,重复定义多个同名的全局变量是合法的

    在C++中,不允许定义多个同名的全局变量,C++直接拒绝这种二义性的做法

    C语言中的多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上

    示例程序:

    上述的程序变量c不是在main函数的起始作用域处定义的,for循环中也定义了i,这在C语言是不合法的,会报错。int型的register变量a,在C++中register会被编译器忽略。

    C++如果定义两个相同的全局变量会直接报错:

    用gcc编译器编译会得到如下错误:

    struct关键字的加强:

      C语言中的struct定义了一组变量的集合

      C语言中的struct定义的标识符并不是一种新的类型

      C++中的struct用于定义一个全新的类型

      C++中进行了类型的加强,非常注重类型,C++中把struct关键字当成是一个定义新类型的关键字,只要struct出现了,C++就认为产生了一种全新的类型。C语言中定义新类型必须要用typedef。

       上面的等价定义中,左边的在C语言中,编译器认为struct定义了一种变量的集合,并且这个变量的集合有一个名字叫做_tag_student,它并不是一种新的类型,如果要将它当做类型来使用,必须要用typedef关键字来定义一个类型名。而在右边的定义中,C++编译器认为struct定义了一种Student新类型。

    标识符:C语言中的默认类型是int,函数在定义时如果没有给出参数或者返回值,则默认为int,也就是上图中i默认为int,f的返回值也默认为int。g的返回值也默认为int,g默认接受任意参数。

      这种默认类型在当代的软件开发中是绝对不允许支持的,因为会引入二义性。因此,C++对这种默认类型进行了升级,使得int f() 和 int f(void)具有相同的意义。并且int f(void)这种写法是为了兼容C语言。

      考虑如下的示例程序:

    用C++编译器会报如下的错误:

    用C语言编译器会报和上面不同的错误:

    面试中的问题:

     对于C++编译器来说它们没有区别,对于C语言编译器,它们是有区别的。

    小结:

      C++更强调实用性,可以在任意地方声明变量。体现在变量的声明地点和struct关键字。

      C++中的register只是一个兼容的作用

      C++编译器能够更好的进行优化

      C++中的任意标识符都必须显式的指明类型,不允许默认类型。

     C++中将C语言中一些有二义性的语法删除了。

  • 相关阅读:
    WPF学习笔记2——WPF子线程更新UI
    WPF学习笔记1——VS2019新建WPF程序
    Asp.Net Core学习笔记3—— .NET Core SDK
    Asp.Net Core学习笔记2—— IIS部署
    Asp.Net Core学习笔记1—— 静态页面
    NGUI带翻页的滑动列表拓展
    用Lua的协程实现类似Unity协程的语句块
    Lua模除运算的大坑
    数据结构和算法总结(三):A* 寻路算法
    Unity3D学习(十一):关于UI销毁后图集仍然无法释放问题的解决办法
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9503295.html
Copyright © 2020-2023  润新知