第2课 C 到 C++ 的升级
1. C与C++的关系
(1)C++继承了所有的C特性,并在C的基础上提供了更多的语法和特性。
(2)C++的设计目标是运行效率与开发效率的统一,它更强调的是语言的实用性。
2. C到C++ 的升级
2.1 变量的定义
①C++中所有的变量都可以在需要使用时再定义,
②而C语言中的变量都必须在作用域开始位置定义。
2.2 register关键字
(1)register关键字请求编译器将局部变量存储于寄存器中
①在C++中依然支持register关键字,但这只是为了兼容C
②C++编译器有自己的优化方式,在C语言中无法获取register变量的地址,因为C认为寄存器是没有地址的。但C++中可以取得register变量的地址。
(2)C++中的register关键字
①C++编译器发现程序中需要取变量地址时,register对变量的声明变得无效。所以C++将无视这个关键字,直接将其register的变量放入内存(注意,不是寄存器)。
②早期C语言编译器不会对代码进行优化。因此可以利用register变量来进行一个很好补充。但C++认为寄存器非常宝贵,这个register关键字并不被推荐使用,它只是为了兼容C而存在。
2.3 重命名全局变量名
(1)在C语言中,重复定义多个同名的全局变量是合法的。C编译器将把多个同名的全局变量最终链接到全局数据区的同一个地址空间上。
(2)在C++中,不允许定义多个同名的全局变量。因为这是一种有二义性的做法,会被C++直接拒绝!
【实例分析】C到C++的升级一
#include <stdio.h> int g_v; //ing g_v; //重复定义全局变量,C是合法的,会映射到同一个地址
//但C++是非法的 int main()
{ printf("Begin...\n"); int c = ; //C++中变量可以随时定义,而不必像C那样必须在作用域
//开始的位置 for (int i=; i<=;i++) //在for循环内定义变量i和j
{
for(int j=; j<=; j++)
{
c += i * j;
}
} printf("c = %d\n", c); register int a = ; //register变量 printf("&a = %p\n", &a); //对a取地址,C++会将a放到内存而不是寄存器
//但在C语言中&a是非法的。 printf("End...\n"); return ;
}
2.4 struct关键字的加强
(1)C语言中的struct定义了一组变量的集合,其定义的标识符并不是一种新的类型。
(2)C++中的struct用于定义一种全新的类型

2.5 标识符的类型
(1)C++中所有的标识符都必须显式的声明类型。C语言中的默认类型(int型)在C++中是不合法的。(C++的返回值与C一样,可以不必声明类型,默认仍为int)
(2)在C和C++中无参与void参数的区别
|
C语言 |
C++ |
|
|
int func() |
返回值为int,接受任意参数 |
返回值为int, 的无参函数 |
|
int func(void) |
返回值默认为int,无参函数 |
|
|
func() |
返回值为int,接受任意参数 |
|
|
func(void) |
返回值默认为int,无参函数 |
|
|
func(i) |
参数为默认的int,等价于int func(int i) |
非法 |
【实例分析】C到C++的升级二
#include <stdio.h> //在C++中Student是一种新的类型,但在C语言要用typedef来重命名
struct Student
{
const char* name;
int age;
}; //C语言中下列是合法的,等价于int f(int i);
//但C++所有的标识符须定义类型,不认识i的类型,会报错
//f(i)
//{
// printf("i = %d\n", i);
//} //C语言中下列是合法的,表示返回值int,接受任意参数
//但C++表示返回值int的无参数,相于当int g(void)
g()
{
return ;
} int main()
{ Student s1 = {"Hello", };
Student s2 = {"World", }; //f(10);//C合法,C++会报错 printf("g() = %d\n",g(,,,,));//C合法,C++中不能为g传入参数 return ;
}
3. 小结
(1)C++更强调实用性,可以在任意的地方声明变量
(2)C++中的register只是一个兼容的作用
(3)C++编译器能够更好的进行优化
(4)C++中的任意标识符都必须显示的指明类型
第2课 C 到 C++ 的升级的更多相关文章
- 第2课 C到C++的升级
C与C++的关系: C++在C语言的基础上进行的升级最重要的是两个方面: 1.类型的加强,C++更称得上是高级语言,C++语言对于类型的检查更严格 2.面向对象的支持,天生支持面向对象软件开发方法学 ...
- 天草(初级+中级+高级)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 ...
随机推荐
- 解决Ubuntu下添加Log却无法输出(高通平台)
1.首先考虑到的是你所添加Log的位置确实没有被调用或者在调用前发生异常终止掉了. 2.你修改后没有进行编译或者没有push/install 3.如果你当前的系统版本是User版本,你在push的时候 ...
- HTTP Header之Content-Type
HTTP Header之Content-Type 目录 1. HTTP Header 2. 文件请求和接口请求 3. 几种 Content-Type 3.1 application/x-www-f ...
- 想ACCESS数据库插入新的用户
public string AddUserN = ""; //定义用户名字符串 public string paswrd1 = ""; //密码1 public ...
- C#并行开发_Thread/ThreadPool, Task/TaskFactory, Parallel
大家好,本次讨论的是C#中的并行开发,给力吧,随着并行的概念深入,哥也赶上这个潮流了,其实之前讨论C#的异步调用或者C#中BeginInvoke或者Invoke都已经涉及了部分本篇的内容. 参考书目: ...
- python 兼容中文路径 + 目标文件是否是图像格式判断
1. 中文路径兼容python程序如果路径中包含中文字符,不加处理会有类似报错:'ascii' codec can't decode byte 0xxx in position xx:ordinal ...
- U盘安装电脑系统教程
[怎么使用u盘安装系统.U盘装系统.如何用U盘安装系统.U盘制作系统.U盘引导.U盘启动.U盘量产.安装系统.如何设置U盘启动] 在电脑系统的日常使用中,经常会遇到系统崩溃或重新安装系统的情况,没有光 ...
- 51Nod 1058: N的阶乘的长度(斯特林公式)
1058 N的阶乘的长度 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3. Inp ...
- 字符串的比较【string和字符数组】
无论是string 还是 字符数组的字符串比较函数,返回的都是字典序的大小.如 1234 和 5 比较时就是1234的字典序小于5,要想比较字符串表示的数字的大小,需要自己写函数比较
- GIT与VCS
GIT 是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制 ...
- vue组件独享守卫钩子函数参数详解(beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave)
一样的和前面路由钩子类似的步骤 首先在demo下面的components下面新建一个test.vue组件 test组件代码 <template> <div class="t ...