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++的升级的更多相关文章

  1. C++深度解析教程学习笔记(6)对象的构造和销毁

    1. 对象的初始化 (1)从程序设计的角度看,对象只是变量,因此: ①在栈上创建对象时,成员变量初始化为随机值 ②在堆上创建对象时,成员变量初始化为随机值 ③在静态存储区创建对象时,成员变量初始化为 ...

  2. C++深度解析教程学习笔记(5)面向对象

    1. 面向对象基本概念 (1)面向对象的意义在于 ①将日常生活中习惯的思维方式引入程序设计中 ②将需求中的概念直观的映射到解决方案中 ③以模块为中心构建可复用的软件系统 ④提高软件产品的可维护性和可扩 ...

  3. C++深度解析教程学习笔记(4)C++中的新成员

    1. 动态内存分配 (1)C++通过 new 关键字进行动态内存申请,是以类型为单位来申请空间大小的 (2)delete 关键字用于内存释放 ▲注意释放数组时要加[],否则只释放这个数组中的第 1 个 ...

  4. C++深度解析教程学习笔记(3)函数的扩展

    1.内联函数 1.1.常量与宏的回顾 (1)C++中的 const 常量可以替代宏常数定义,如: ; //等价于 #define A 3 (2)C++中是否有解决方案,可以用来替代宏代码片段呢? 1. ...

  5. C++深度解析教程学习笔记(2)C++中的引用

    1.C++中的引用 (1)变量名的回顾 ①变量是一段实际连续存储空间的别名,程序中通过变量来申请并命名存储空间 ②通过变量的名字可以使用存储空间.(变量的名字就是变量的值,&变量名是取地址操作 ...

  6. 《Spring源码深度解析》学习笔记——Spring的整体架构与容器的基本实现

    pring框架是一个分层架构,它包含一系列的功能要素,并被分为大约20个模块,如下图所示 这些模块被总结为以下几个部分: Core Container Core Container(核心容器)包含有C ...

  7. Webpack新手入门教程(学习笔记)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...

  8. 尚硅谷韩顺平Linux教程学习笔记

    目录 尚硅谷韩顺平Linux教程学习笔记 写在前面 虚拟机 Linux目录结构 远程登录Linux系统 vi和vim编辑器 关机.重启和用户登录注销 用户管理 实用指令 组管理和权限管理 定时任务调度 ...

  9. jfinal框架教程-学习笔记

    jfinal框架教程-学习笔记 JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restfu ...

随机推荐

  1. IPC 进程间通信

    linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它 ...

  2. mysqli得到记录数量

    $result = $conn->query($sql);$result->num_rows;

  3. C#验证类

    #region 是不是中国电话,格式010-85849685 /**////<summary> /// 是不是中国电话,格式010-85849685 ///</summary> ...

  4. Java中常见的比较器的实现方法

    在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...

  5. hzau 1209 Deadline(贪心)

    K.Deadline There are N bugs to be repaired and some engineers whose abilities are roughly equal. And ...

  6. eclipse 创建 maven web工程

    填写完点finish,创建成功 接着找到工作空间创建的这个项目,.settings文件夹下修改两个文件 改为自己的java版本,我的是1.8 将项目改为动态3.0 此时项目还没有web.xml,接下来 ...

  7. BW信息STMS传输

    项目时先接过来的.前面的人建了很多数据源,信息对象.我也建了不少.最后分成三个包.非常混乱,信息对象不在一个包里.导入报错.先后顺序也没有逻辑.可为难我了. 本来想着是全部释放掉,然后在传输连接收集自 ...

  8. BW里转换简单常用ABAP

    用户查看的是当时的物料折让,那你必然要给物料加个时间,才好区分.总是以现在最新的物料状态查看历史数据会出现问题.当时这个物料是折让的,现在不折让了.数据会有问题.加个DSO.做一个时间记录.读取系统时 ...

  9. js字符串常用操作

    1.字符串分割 var myStr = "I,Love,You,Do,you,love,me"; var substrArray = myStr .split(",&qu ...

  10. LSTM与Highway-LSTM算法实现的研究概述

    LSTM与Highway-LSTM算法实现的研究概述 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2015-12-22 ...