0.目录

1.C与C++的关系

2.C到C++的升级

3.小结

1.C与C++的关系

  • C++继承了所有的C特性
  • C++在C的基础上提供了更多的语法和特性
  • C++的设计目标是运行效率与开发效率的统一

2.C到C++的升级

2.1 语言的实用性

C++更强调语言的实用性
C++中所有的变量都可以在需要使用时再定义

而C语言中的变量都必须在作用域开始的位置定义!!
(早期的C89/90标准确实是这样的规定,但是后来的C99标准允许随用随定义,目前大部分编译器都已支持C99标准,但仍有少量编译器没有支持。)

2.2 register关键字

register关键字请求编译器将局部变量存储于寄存器中,在C++中依然支持register关键字
(如果register请求通过的话,那么变量就放在寄存器里面,从而效率就提高了。
register关键字仅仅是一个请求编译器做某事,因此的话编译器完全可以拒绝。
所以一直以来,register在C语言中的地位,虽然对于提高效率来说看上去很重要,但其实很鸡肋。因为编译器发展到后期之后,编译器本身就会做优化了,也许你不写register关键字,编译器仍然会将一个变量存储于寄存器当中。
所以说C语言里面的register关键字就显得在工程开发中比较鸡肋。于是通过这种工程经验,C++里面虽然依旧支持register,但仅仅是为了兼容C语言。)

C++编译器有自己的优化方式:

  • C语言中无法获取register变量的地址
  • C++中可以取得register变量的地址

C++中的register关键字:

  • C++编译器发现程序中需要取register变量的地址时,register对变量的声明变得无效。
  • 早期C语言编译器不会对代码进行优化,因此register变量是一个很好的补充。

2.3 同名的全局变量

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

C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。(C++直接拒绝这种二义性的做法!)

2.4 struct关键字

  • C语言中的struct定义了一组变量的集合
  • C语言中struct定义的标识符并不是一种新的类型
  • C++中的struct用于定义一个全新的类型


(如果在C语言里面需要将struct定义的这个集合当成一种类型来使用的话,那就必须要通过typedef关键字来重命名一下,这是C语言里的做法。
然而在C++中,有一个重大的改进,就是类型的加强,也就是说,C++里面非常注重类型,在C++里面,就把struct关键字当成一个定义新类型的关键字,只要struct出现了,C++编译器就会认为这里产生了一个全新的类型,因此C和C++中结构体的定义在写法上是等价的。
在C++看来,struct就定义了一个名为Student的新类型,但是C语言看来,这里只是定义了一个变量的集合,并且这个变量的集合有一个名字,叫做_tag_student,它并不是一种新类型。如果非要当成一种新类型来使用,就必须通过typedef给它一个类型名。
C++这样做有什么好处:更清晰,可读性更好。)
也就是说:

2.5 int f() 与 int f(void) 有区别吗?

面试中的小问题,int f() 与 int f(void) 有区别吗?如果有区别是什么?

在C语言中:

  • int f() 表示返回值为 int,接受任意参数的函数
  • f(void) 表示返回值为 int 的无参函数

在C++中:

  • int f() 和 int f(void) 具有相同的意义
  • 都表示返回值为 int 的无参函数

总结:

  • C++中所有的标识符都必须显示的声明类型
  • C语言中的默认类型在C++中是不合法的

3.小结

  • C++更强调实用性,可以在任意的地方声明变量
  • C++中的register只是一个兼容的作用
  • C++编译器能够更好的进行优化
  • C++中的任意标识符都必须显示的指明类型

C++解析(1):C到C++的升级的更多相关文章

  1. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q45-Q48)

    Question 45 You are designing a branding strategy for a customer with a new SharePoint 2010 server f ...

  2. ubuntu下解析udt数据包

    udt是通过udp进行端到端可靠传输的一个协议,有其默认拥塞控制算法. 之前ubuntu下wireshark的版本是1.10,不能直接解析udt数据包[1],升级到最新的2.0.0即可过滤udt数据包 ...

  3. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q57-Q59)

    Question 57You update a solution validator.You need to ensure that all SharePoint solutions are vali ...

  4. Gitlab备份、迁移、恢复和升级

    Gitlab备份.迁移.恢复和升级 自建的Gitlab服务器常常会因为使用时间的增长,其空间容量等硬件需求都需要升级,或者迁移至更高配置的服务器上.备份.迁移.恢复.升级过程如下 1.gitlab备份 ...

  5. Android Recovery OTA升级(一)—— make otapackage

    文件夹 文件夹 概述 make otapackage BUILT_TARGET_FILES_PACKAGE ota_from_target_files WriteFullOTAPackage Sign ...

  6. 将mysql从5.5.25升级到8.0.12

    将mysql从5.5.25升级到8.0.12过程中遇到几个问题,记录如下: 将数据库安装好后,导入原来的数据,启动tomcat,报错unable to load authentication   ca ...

  7. 【公告】淘宝 npm 域名即将切换 && npmmirror 重构升级

    镜像下载.域名解析.时间同步请点击阿里云开源镜像站 前言 本文将包括两部分内容: 淘宝 npm 域名即将停止解析 npmmirror 镜像站大重构升级 原淘宝 npm 域名即将停止解析 正如在< ...

  8. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  9. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.2

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  10. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.0.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

随机推荐

  1. 成都优步uber司机奖励政策(持续更新)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://didi-uber.com/archiv ...

  2. python 多线程笔记(2)-- 锁

    锁是什么?什么场合使用锁? 锁是一种机制,用于保护那些会引起冲突的资源. 比如上厕所,进去之后第一件事干嘛?把厕所门反锁!表示什么呢?表示这个厕所正在使用中! 至于在厕所里面干大事.干小事.还是打飞机 ...

  3. DSP6748学习笔记-190116

    1. PSC是什么?电源和睡眠控制器.一个PSC模块由一个全局PSC和一组本地PSC组成,那么又是什么? PSCModuleControl(SOC_PSC_0_REGS, , PSC_POWERDOM ...

  4. MyBatis.Net 配置

    假设我们现在有这样的需求,要对学生信息进行管理 学生表有要以下要求 字段名称 数据类型 说明 stuNo 字符 学号,该列必填,为主键递增 stuName 字符 学生姓名,该列必填,要考虑姓氏可能是两 ...

  5. XAF-如何在详细视图界面显示按钮(含示例项目下载)

    默认情况下,指定了按钮的Category后,将在对应的按钮容器显示按钮.有时候,我们需要将按钮显示在详细视图中. 本示例源码 创建一个控制器,并填加按钮.设置好了所有ID.Caption后,给Cate ...

  6. robotframework 脚本编写规范

    测试集.脚本 测试脚本的名字不要超过20个字符,文件类型应该为txt  名字必需易读且有意义(看名知意)  记住测试集的名字是自动根据文件.目录的名字创建的.后缀名会被截去,下划线会转换为空格,如果名 ...

  7. Angular7运行机制--根据腾讯课堂米斯特吴 《Angular4从入门到实战》学习笔记分析完成

  8. 如何使用openstack OCL

    本节首先讨论 image 删除操作,然后介绍 OpenStack CLI 的使用方法,最后讨如何 Troubleshoot. Web UI 删除 image admin 登录后,Project -&g ...

  9. gulp4.0 存在的错误信息 The following tasks did not complete: default,Did you forget to signal async completion?

    当gulp为如下代码的时候: // 以下代码会执行在node环境下 const gulp = require( "gulp" ); // 创建一个gulp的任务 gulp.task ...

  10. 王者荣耀交流协会第三次Scrum立会

    会议时间:2017年10月22号   18:00-18:32,时长32分钟. 会议地点:中快餐厅二楼第二排倒数第二个桌子. 立会内容: 1.每位同学汇报了今日工作. 2.通过讨论我们决定用存excel ...