C++解析(1):C到C++的升级
0.目录
1.C与C++的关系
2.C到C++的升级
- 2.1 语言的实用性
- 2.2 register关键字
- 2.3 同名的全局变量
- 2.4 struct关键字
- 2.5 int f() 与 int f(void) 有区别吗?
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++的升级的更多相关文章
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q45-Q48)
Question 45 You are designing a branding strategy for a customer with a new SharePoint 2010 server f ...
- ubuntu下解析udt数据包
udt是通过udp进行端到端可靠传输的一个协议,有其默认拥塞控制算法. 之前ubuntu下wireshark的版本是1.10,不能直接解析udt数据包[1],升级到最新的2.0.0即可过滤udt数据包 ...
- Sharepoint学习笔记—习题系列--70-573习题解析 -(Q57-Q59)
Question 57You update a solution validator.You need to ensure that all SharePoint solutions are vali ...
- Gitlab备份、迁移、恢复和升级
Gitlab备份.迁移.恢复和升级 自建的Gitlab服务器常常会因为使用时间的增长,其空间容量等硬件需求都需要升级,或者迁移至更高配置的服务器上.备份.迁移.恢复.升级过程如下 1.gitlab备份 ...
- Android Recovery OTA升级(一)—— make otapackage
文件夹 文件夹 概述 make otapackage BUILT_TARGET_FILES_PACKAGE ota_from_target_files WriteFullOTAPackage Sign ...
- 将mysql从5.5.25升级到8.0.12
将mysql从5.5.25升级到8.0.12过程中遇到几个问题,记录如下: 将数据库安装好后,导入原来的数据,启动tomcat,报错unable to load authentication ca ...
- 【公告】淘宝 npm 域名即将切换 && npmmirror 重构升级
镜像下载.域名解析.时间同步请点击阿里云开源镜像站 前言 本文将包括两部分内容: 淘宝 npm 域名即将停止解析 npmmirror 镜像站大重构升级 原淘宝 npm 域名即将停止解析 正如在< ...
- 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...
- 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.2
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...
- 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.0.1
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...
随机推荐
- gdb调试带参数程序
一般来说GDB主要调试的是C/C++的程序.要调试C/C++的程序,首先在编译时,我们必须要 把调试信息加到可执行文件中.使用编译 器(cc/gcc/g++)的 -g 参数可以做到这一点.如: > ...
- (一)SpringBoot2.0基础篇- 介绍及HelloWorld初体验
1.SpringBoot介绍: 根据官方SpringBoot文档描述,BUILD ANYTHING WITH SPRING BOOT (用SPRING BOOT构建任何东西,很牛X呀!),下面是官方文 ...
- 洛谷P2831 愤怒的小鸟
洛谷P2831 愤怒的小鸟 原题链接 题解 首先简单数学公式送上. \(ax_1^2+bx_1=y_1\) \(ax_2^2+bx_2=y_2\) \(ax_1^2x_2+bx_1x_2=y_1x_2 ...
- 【MYSQL权限】数据库权限部署
背景:没有划分数据库权限,所有人共用一个账号 本人公司现有的数据库账号分布情况: 所有人用一个账号(包括程序里面访问数据库的的配置文件里面的账号),该账号除删库权限,其他权限大部分都有. 这样非数据库 ...
- Spring学习(三)-----Spring自动装配Beans
在Spring框架,可以用 auto-wiring 功能会自动装配Bean.要启用它,只需要在 <bean>定义“autowire”属性. <bean id="custom ...
- Java的Graphics类进行绘图的方法详解
Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力. Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形等 ...
- 使用performance进行前端性能监控
该文章仅作为自己的总结 1.performance.timing对象 navigationStart:当前浏览器窗口的前一个网页关闭,发生unload事件时的Unix毫秒时间戳.如果没有前一个网页,则 ...
- MapReduce和yarn
1.Mapreduce是什么? Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架: Mapreduce核心功能是将用户编写的业务逻辑代码和自带默 ...
- SQL Server临时表漫谈
SQL Server是微软的关系型数据库,对于刚入门的我是一个非常友好的开发工具.可视化界面的安装与操作,非常适合刚入门的我. 其实大家要找这方面的资料,在网上一搜一大堆,这里我就不赘述那些了,基本都 ...
- 高可用Kubernetes集群-9. 部署kubelet
十一.部署kubelet 接下来两个章节是部署Kube-Node相关的服务,包含:kubelet,kube-proxy. 1. TLS bootstrap用户授权 # kubelet采用TLS Boo ...