C++深度解析教程学习笔记(1)C到C++的升级
1.现代软件产品架构图
比如商场收银系统
2.C 到 C++ 的升级
2.1变量的定义
C++中所有的变量都可以在需要使用时再定义,而 C 语言中的变量都必须在作用域开始位置定义。
2.2 register 关键字
(1)register 关键字请求编译器将局部变量存储于寄存器中
在 C++中依然支持 register 关键字,但这只是为了兼容 C,C++编译器有自己的优化方式,在 C 语言中无法获取 register 变量的地址,因为 C认为寄存器是没有地址的。但 C++中可以取得 register 变量的地址。
①C++编译器发现程序中需要取变量地址时,register 对变量的声明变得无效。所以C++将无视这个关键字,直接将其 register 的变量放入内存(注意,不是寄存器)。
②早期 C 语言编译器不会对代码进行优化。因此可以利用 register 变量来进行一个很好补充。但 C++认为寄存器非常宝贵,这个 register 关键字并不被推荐使用,它只是为了兼容C 而存在。
2.3 重命名全局变量名
(1)在 C 语言中,重复定义多个同名的全局变量是合法的。C 编译器将把多个同名的全局变量最终链接到全局数据区的同一个地址空间上。
(2)在 C++中,不允许定义多个同名的全局变量。因为这是一种有二义性的做法,会被C++直接拒绝
#include <stdio.h> int g_v;
//重复定义全局变量,C是合法的,会映射到同一个地址,C++是非法的
//ing g_v; int main()
{
printf("Begin...\n");
//C变量必须定义在作用域开始的位置,C++中可以随时定义
int c = ; //在for循环内定义变量i和j
for (int i=; i<=;i++)
{
for(int j=; j<=; j++)
{
c += i * j;
}
} printf("c = %d\n", c);
//声明为register
register int a = ;
//对a取地址,C++会将a放到内存而不是寄存器,C语言中&a是非法的。
printf("&a = %p\n", &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) |
非法 |
#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", }; //C合法,C++会报错
//f(10);
//C语言合法,C++中报错
printf("g() = %d\n",g(,,,,)); return ;
}
2.6 C和C++中的const
1. C 语言中的 const
(1)const 修饰的变量是只读的,使得变量具有只读属性,但本质还是变量。所以不是真正的常量,它只是告诉编译器该变量不能出现在赋值符号的左边。
(2)const 修饰的局部变量在栈上分配空间,全局变量在只读存储区分配空间
(3)const 只在编译期有用,在运行期无用
#include <stdio.h> int main()
{
const int c = ; //C语言中会为变量c分配内存
int* p = (int*)&c; //C++中遇到&才为c分配内存 printf("Begin...\n"); *p = ; //内存中的值己被改为5. printf("c = %d\n", c);//C语言会输出内存中的5.
//C++中会从符号表(而不是内存)中取值
//所以为0. printf("End...\n");
return ;
}
2. C++中的 const
(1)C++在 C 的基础上对 const 进行了优先处理,当碰见 const 声明时在符号表中放入常量。
(2)编译过程中若发现使用常量,则直接以符号表中的值替换。
(3)编译过程中若发现对 const 常量使用了 extern 或&操作符,则会给对应的常量分配存储空间。注意,C++编译器虽然可能为 const 常量分配空间,但不会使用其存储空间中的值。
3. 对比 C/C++中的 const
C语言 |
C++ |
|
本质 |
只读变量 |
常量 |
分配内存 |
会分配 |
当使用&操作符对const常量取地址时分配 当const常量为全局,并且需要在其它文件中使用时会分配内存 |
4. C++中的 const 与宏的区别
C++中的const |
宏 |
|
定义 |
const int c = 5; |
#define c 5 |
处理方式 |
由编译器处理,编译器会进行类型检查和作用域检查 |
由预处理器处理,只是简单的文本替换 |
#include <stdio.h> void f()
{
//宏由预编译处理,其后面的宏起作用
#define a 3 const int b = ;//作用域仅限于f函数
} void g()
{
printf("a = %d\n", a); //合法,只要是宏定义之后都可以使用
//printf("b = %d\n", b); //非法b的作用域仅限于f函数
} int main()
{
const int A = ;
const int B = ;
int array[A + B] = {};//C++中合法,因为它认为A、B都是常量。
//而C语言的const本质还是变量,数组大小只能是常量 int i = ; for(i=;i<(A + B); i++)
{
printf("array[%d] = %d\n", i, array[i]);
} f();
g(); return ;
}
2.7 布尔类型
(1)C++在 C 语言的基本类型系统之上增加了 bool,其可能的取值只有 true(1)和false(0)
(2)理论上 bool 只占用一个字节
(3)bool 类型是基本类型,可以用来定义 bool 型的全局变量、常量、指针和数组等。
(3)C++编译器会将非 0 值转换 true(即 1),0 值转换为 false(即 0)
#include <stdio.h> int main()
{
bool b = false;
int a = b; printf("sizeof(b) = %d\n", sizeof(b)); //
printf("b = %d\n, a = %d\n", b, a); //0, 0 b = ; //编译器发现会bool型赋值非0,就会转化为1
a = b; //a为1 printf("b = %d, a = %d\n",b, a);
b = -; //非0,被转为1
a = b; //a为1 printf("b = %d, a = %d\n",b, a); //1,1 a = ;
b = a; //非0,被转为1 printf("a = %d, b = %d\n",a, b); //10,1 a = ;
b = a; // printf("a = %d, b = %d\n",a, b); //0,0 return ;
}
2.8 三目运算符
(1)C 语言中的三目运算符返回的是变量的值,因值不能作为左值使用
(2)C++中的三目运算符
①如果?后面的两个操作数有一个是常量,则行为与 C 语言的运算符一样,返回的是变量的值。
②如果?后面的两个操作数都是变量,则返回变量的引用(相当于变量本身),如此,既可以作为右值,也可以作为左值使用。
#include <stdio.h> int main()
{
//C++中的三目运算符
int m = ;
int n = ;
printf("m = %d, n = %d\n", m, n); (m < n ? m : n) = ;//?后的m、n都是变量,返回的是引用,
//将3赋值给一个变量的引用,是合法的 //(m < n ? m : 2) = 3;//?后的操作数2为常量,将返回的是值,
//从语义看,要将3赋值给2,是非法的 printf("m = %d, n = %d\n", m, n); //在C语言中,可通过其返回的是值的特点,可以通过如下方式来修改m或n
*(m < n ?&m : &n) = ;//返回m,n的地址,再通过地址给变量赋值,非法的。
printf("m = %d, n = %d\n", m, n); return ;
}
C++深度解析教程学习笔记(1)C到C++的升级的更多相关文章
- C++深度解析教程学习笔记(6)对象的构造和销毁
1. 对象的初始化 (1)从程序设计的角度看,对象只是变量,因此: ①在栈上创建对象时,成员变量初始化为随机值 ②在堆上创建对象时,成员变量初始化为随机值 ③在静态存储区创建对象时,成员变量初始化为 ...
- C++深度解析教程学习笔记(5)面向对象
1. 面向对象基本概念 (1)面向对象的意义在于 ①将日常生活中习惯的思维方式引入程序设计中 ②将需求中的概念直观的映射到解决方案中 ③以模块为中心构建可复用的软件系统 ④提高软件产品的可维护性和可扩 ...
- C++深度解析教程学习笔记(4)C++中的新成员
1. 动态内存分配 (1)C++通过 new 关键字进行动态内存申请,是以类型为单位来申请空间大小的 (2)delete 关键字用于内存释放 ▲注意释放数组时要加[],否则只释放这个数组中的第 1 个 ...
- C++深度解析教程学习笔记(3)函数的扩展
1.内联函数 1.1.常量与宏的回顾 (1)C++中的 const 常量可以替代宏常数定义,如: ; //等价于 #define A 3 (2)C++中是否有解决方案,可以用来替代宏代码片段呢? 1. ...
- C++深度解析教程学习笔记(2)C++中的引用
1.C++中的引用 (1)变量名的回顾 ①变量是一段实际连续存储空间的别名,程序中通过变量来申请并命名存储空间 ②通过变量的名字可以使用存储空间.(变量的名字就是变量的值,&变量名是取地址操作 ...
- 《Spring源码深度解析》学习笔记——Spring的整体架构与容器的基本实现
pring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,如下图所示 这些模块被总结为以下几个部分: Core Container Core Container(核心容器)包含有C ...
- Webpack新手入门教程(学习笔记)
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...
- 尚硅谷韩顺平Linux教程学习笔记
目录 尚硅谷韩顺平Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 定时任务调度 ...
- jfinal框架教程-学习笔记
jfinal框架教程-学习笔记 JFinal 是基于 Java 语言的极速 WEB + ORM 开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restfu ...
随机推荐
- hdu 1695 GCD 莫比乌斯
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- svg_鼠标手型
1. 貌似是 属性 "cursor :pointer;",待测试. 2.
- liunx常用命令-----查找命令
locate 根据文件名查找文件 根据数据库记录搜索,当天创建的搜不到 whereis which 搜索命令的命令 如 whereis ls find /root -name ...
- 使用PathfindingProject Pro 4.0.10实现2D自动寻路
昨天由于策划的要求,要在项目的最后加个自动寻路的功能,跑去研究了下自动寻路的插件.不多说,上操作 首先在寻路的游戏物体上加上seeker.AI Lerp这两个脚本,注意要给target赋值. 之后给目 ...
- CentOS 7 安装 Git
服务器端 1.先从yum安装git yum –y install git 2.在需要的位置创建一个裸仓库(最后以.git结尾) cd /usr/local mkdir git cd git git i ...
- websphere6.1升级
1.到IBM websphere官方网站下载相应版本的更新包,如6.1.0-WS-WASSDK-WinX32-FP0000021.pak和6.1.0-WS-WAS-WinX32-FP0000021.p ...
- python--关于if __name__==__main__的解释
在解释之前首先我们看下__name__这个变量存的是什么: #!/usr/bin/env python # -*- coding:utf-8 -*- print(__name__) 结果: __mai ...
- tensorflow中创建多个计算图(Graph)
tf程序中,系统会自动创建并维护一个默认的计算图,计算图可以理解为神经网络(Neural Network)结构的程序化描述.如果不显式指定所归属的计算图,则所有的tensor和Operation都是在 ...
- php 利用header 函数 下载各种文件
http://www.php.net/manual/en/function.readfile.php <?php /** * 下载文件 * header函数 * */ dl_file($_GET ...
- 织梦dedecms如何批量替换文章内容和缩略图
文章来自:http://blog.sina.com.cn/s/blog_475ea1130101co6w.html 第一种方法: 进入后台,点左侧的采集,点选批量维护的数据库内容替换. 1.替换标题内 ...