第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语言中一些有二义性的语法删除了。
第2课 C到C++的升级的更多相关文章
- 第2课 C 到 C++ 的升级
1. C与C++的关系 (1)C++继承了所有的C特性,并在C的基础上提供了更多的语法和特性. (2)C++的设计目标是运行效率与开发效率的统一,它更强调的是语言的实用性. 2. C到C++ 的升级 ...
- 天草(初级+中级+高级)VIP和黑鹰VIP破解教程(全部iso下载地址)
以下就是我收集的教程地址,之前我收集到的都是一课一课下载的,虽然这样,我也下载完了天草的全部课程.这里分享的是在一起的iso文件,比起一课课下载爽多了.~~ 还有这些教程都是从零起点开始教的,不用担心 ...
- 大叔力量VIP介绍
VIP介绍 框架技术点 平台 仓储 日志收集 缓存 消息队列 服务总线 事务 任务调度 授权 模块化 服务发现 .net ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ ✔ - .net core ✔ ✔ ✔ ✔ ✔ ...
- 微服务SpringCloud+Docker入门到高级实战(教程详情)
第一章 课程介绍和学习路线 1.微服务架构SpringCloud课程介绍 简介:课程介绍和课程大纲讲解,讲课风格和重点内容理解技巧 2.技术选型和学后水平 简介:课程所需基础和技术选型讲解,学完课程可 ...
- 微服务SpringCloud+Docker入门到高级实战(目录)
第一章 课程介绍和学习路线 1.微服务架构SpringCloud课程介绍 简介:课程介绍和课程大纲讲解,讲课风格和重点内容理解技巧2.技术选型和学后水平 简介:课程所需基础和技术选型讲解,学完课程可以 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_1_01课程简介
笔记 ============================================= SpringCloud课程笔记.txt 第一章 课程介绍和学习路线 1.微服务架构SpringClou ...
- 《C++深度解析》课程目录
<C++深度解析>课程目录 第1课 - 学习 C++ 的意义 第2课 - C到C++的升级 第3课 - 进化后的const分析 第4课 - 布尔类型和引用 第5课 - 引用的本质分 ...
- 【C++第二课】---C到C++的函数升级
C++中对C语言在函数使用方面做了很大的升级 一﹑内联函数 1.C++中推荐使用内联函数来替代宏片段代码 2.C++中使用关键字inline声明内联函数 例如: inline int func(int ...
- Magento学习第一课——目录结构介绍
Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zen ...
随机推荐
- HDU3579:Hello Kiki(解一元线性同余方程组)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3579 题目解析:求一元线性同余方程组的最小解X,需要注意的是如果X等于0,需要加上方程组通解的整数区间lc ...
- 数据挖掘-聚类分析(Python实现K-Means算法)
概念: 聚类分析(cluster analysis ):是一组将研究对象分为相对同质的群组(clusters)的统计分析技术.聚类分析也叫分类分析,或者数值分类.聚类的输入是一组未被标记的样本,聚类根 ...
- [华为]查找两个字符串a,b中的最长公共子
链接:https://www.nowcoder.com/questionTerminal/181a1a71c7574266ad07f9739f791506来源:牛客网 查找两个字符串a,b中的最长公共 ...
- STL学习笔记--各种容器的运用时机
如何选择最佳的容器类别? 缺省情况下应该使用vector.vector的内部结构简单,并允许随机存取,所以数据的存取十分方便灵活,数据的处理也够快. 如果经常要在序列的头部和尾部安插和移除元素,应采用 ...
- liunx 命令行快捷键 常用命令
常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) mkdir ...
- springcloud8----feign-with-hystrix
Feign也可以使用Hystrix: package com.itmuch.cloud; import org.springframework.boot.SpringApplication; impo ...
- 337BRoutine Problem
/*给出你图片的长和宽的比例a:b 和摄像头的比例c:d,然后叫你求最后将图片放进摄像头 以后,剩余的面积比上摄像头的总面积,注意要化简为最简形式,而且摄像头要设置成至少一条边和图片相等 做法:先将两 ...
- asp.net调用opencv类库,实现图像处理显示
asp.net调用opencv类库,实现图像处理显示 原理上来说,通过dll的调用,无论是asp.net还是winform都可以调用opencv及其类库.但是在实现的过程还是有许 ...
- log4j2配置按照日志级别将日志输出到不同的文件
背景 在项目中,可能会产生非常多的日志记录,为了方便日志分析,可以将日志按级别输出到指定文件. log4j2.xml配置文件 <!--将info级别的日志单独输出到info.log中--> ...
- lxml.etree去除子节点
去除etree中的某个子节点有两种方法: 1.parentnode.remove(node) 2.etree.strip_elements(html, 'element_name', with_tag ...