第1节 C 到C++ 的升级

-------------------------------------资源来源于网络,仅供自学使用,如有侵权,联系我必删.
第一:
学习C++的意义
当面向过程方法论暴露越来越多的缺陷的时候,业界开始考虑在工程项目中引入面向对象的设计方法,而第一个需要解决的问题就是:高效的面向对象语言,并且能够兼容已经存在的代码。
第1节 C 到C++ 的升级
文章图片

C语言的加强
C语言和C++并不是对立的竞争关系
C++是C语言的加强,是一种更好的C语言
C++是以C语言为基础的,并且完全兼容C语言的特性
第1节 C 到C++ 的升级
文章图片


第二:
现代软件产品的特性:
系统一般是由多种语言写成的
系统架构的目标是拥抱用户需求的变化
系统拥有较好的移植性
系统能够方便的部署和更新

操作系统的修改和驱动程序的开发在现代软件产品中占据的比重越来越小
【第1节 C 到C++ 的升级】
第三:
C 与 C++ 的关系
?C++ 继承了所有的C 特性
?C++ 在C的基础上提供了更多的语法和特性
?C++ 的设计目标是运行效率与开发效率的统一
第1节 C 到C++ 的升级
文章图片


第四:
C++ 中更强调语言的“ 实用性” ,所有的变量都可以在需要使用时再定义

#include int main(int argc, char *argv[]) { int c = 0; printf("Begin...\n"); for(int i=0; i<10; i++)//在C里面,声明变量要在程序最开始的地方 { for(int j=0; j<10; j++) { c += i * j; } }printf("c = %d\n", c); printf("End...\n"); printf("Press enter to continue ..."); getchar(); return 0; }

第1节 C 到C++ 的升级
文章图片
第1节 C 到C++ 的升级
文章图片

注意:
C 语言中的变量都必须在作用域开始的位置定义!!

第五:
register 关键字的变化
? register 关键字请求“ 编译器” 将局部变量存储于寄存器中
? C 语言中无法取得register 变量地址
? 在 在C++ 中依然支持register 关键字
? C++ 编译器有自己的优化方式,不使用register 也可能做优化
? C++ 中可以取得register
C++ 编译器发现程序中需要取 register 变量的地址时, register 对变量的声明变得无效。
早期C 语言编译器不会对代码进行优化,因此register 变量是一个很好的补充
#include int main(int argc, char *argv[]) { register int c = 0; printf("Begin...\n"); printf("&c = %08X\n", &c); //取寄存器变量地址printf("End...\n"); printf("Press enter to continue ..."); getchar(); return 0; }

第1节 C 到C++ 的升级
文章图片
第1节 C 到C++ 的升级
文章图片


第六:
?在 C 语言 中,重复定义 多个同名的全局变量 是 合法 的
?在 C++ 中, 不允许定义多个同名的全局变量
C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。
C++ 直接拒绝这种二义性的做法
#include int g_var; int g_var = 1; int main(int argc, char *argv[]) { printf("Begin...\n"); printf("g_var = %d\n", g_var); printf("End...\n"); printf("Press enter to continue ..."); getchar(); return 0; }

第1节 C 到C++ 的升级
文章图片

第1节 C 到C++ 的升级
文章图片

第七:
下面的代码输出什么?
#include int main(int argc, char *argv[]) { const int c = 0; int* p = (int*)&c; printf("Begin...\n"); *p = 5; printf("c = %d\n", c); //在C里面,c是只读变量,c=5在C++里面,c是常量c=0printf("End...\n"); printf("Press enter to continue ..."); getchar(); return 0; }

第1节 C 到C++ 的升级
文章图片

C++ 编译器对 const 常量的处理
?当碰见常量声明时在符号表中放入常量
?编译过程中若发现使用常量则直接以符号表中的值替换
?编译过程中若发现对 const 使用了 extern 或者& 操作符,则给对应的常量分配存储空间
注意:
C++ 编译器虽然可能为 const 常量分配空间,但不会使用其存储空间中的值。
第1节 C 到C++ 的升级
文章图片


第八:
? C 语言中的 const 变量
C 语言中 const 变量是只读变量,有自己的存储空间
?C++ 中的 const 常量
可能分配存储空间
? 当const 常量为全局,并且需要在其它文件中使用
? 当使用&操作符取 const 常量的地址

C++ 中的const 常量
#include int main(int argc, char *argv[]) { //a和b 是 常量 const int a = 1; const int b = 2; int array[a + b] = {0}; int i = 0; for(i=0; i<(a+b); i++) { printf("array[%d] = %d\n", i, array[i]); }printf("Press enter to continue ..."); getchar(); return 0; }

第1节 C 到C++ 的升级
文章图片

?C++ 中的const 小结
? C++ 中的const 常量类似于宏定义
const int c = 5; ≈ #define c 5
? C++ 中的const 常量在与宏定义不同
? const 常量是由编译器处理的,提供类型检查和作用域检查
?宏定义由预处理器处理,单纯的文本替换

const 常量和宏的区别
#include void f() { #define a 3 const int b = 4; }void g() { printf("a = %d\n", a); //printf("b = %d\n", b); }int main(int argc, char *argv[]) { f(); g(); printf("Press enter to continue ..."); getchar(); return 0; }

第1节 C 到C++ 的升级
文章图片


第九:
struct 类型的加强
?C 语言的 struct 定义了一组变量的集合,C编译器并不认为这是一种新的类型
?C++ 中的 struct 是一个新类型的定义声明
#include struct Student { const char* name; int age; }; int main(int argc, char *argv[]) { Student s1 = {"Delphi", 30}; //C++里面,Student是一个新类型在C里面不会认为Student是一个新类型 Student s2 = {"Tang", 30}; printf("Press enter to continue ..."); getchar(); return 0; }

第1节 C 到C++ 的升级
文章图片

第1节 C 到C++ 的升级
文章图片


第十:
? C++ 中所有的变量和函数都必须有类型
? C 语言中的默认类型在C++是不合法的
#include f(i)//C里面合法 { printf("i = %d\n", i); }g()//C里面合法,不合法 { return 5; }int main(int argc, char *argv[]) { printf("Begin...\n"); f(10); printf("g() = %d\n", g(1,2,3,4,5)); printf("End...\n"); printf("Press enter to continue ..."); getchar(); return 0; }

第1节 C 到C++ 的升级
文章图片


第十一:
思考
intf(); 与 int f(void ); 的区别是什么?
?在C 语言中
? int f() ;表示返回值为int ,接受任意参数的函数
? int f(void) ;表示返回值为int 的无参函数
?在C++中
? int f(); 和int f(void) 具有相同的意义,都表示返回值为int

小结
?C++ 以C语言为基础进行了加强
?C++ 更强调实用性,可以在任意的地方声明变量
?C++ 中的 register 只是一个向后兼容的作用, C++ 编译器能够进行更好的变量优化
?C++ 中的 const 是一个真正意义上的常量,而不是只读变量
?C++ 更加强调类型,任意的程序元素都必须显示指明类型

    推荐阅读