广州南沙网站建设,宁波网络优化seo报价,广告推广平台有哪些,江苏商城网站制作公司一、C介绍 本贾尼.斯特劳斯特卢普#xff0c;于1979年在贝尔实验室负责分析UNIX系统内核流量的分布情况时#xff0c;特别希望有一种更加模块化的工具#xff0c;于1979.10开始着手研发一款新的编程语言#xff0c;在C语言的基础上增加了面向对象的机制#xff0c;也就是C…一、C介绍 本贾尼.斯特劳斯特卢普于1979年在贝尔实验室负责分析UNIX系统内核流量的分布情况时特别希望有一种更加模块化的工具于1979.10开始着手研发一款新的编程语言在C语言的基础上增加了面向对象的机制也就是C1983年完成了C的第一个版本 C与C的关联和重要区别 1、C完全兼容C语言的所有内容 2、支持面向对象的编程思想 //C是面对过程的 3、支持运算符重载、函数重载的编译时多态机制 //抽象封装 继承 多态 4、泛型编程、模版编程 5、支持异常处理 6、类型检查更加严格 7、C增加了名字空间的机制 二、第一个C程序 #include iostream
using namespace std;int main(int argc,const char* argv[])
{cout Hello World! endl;return 0;
} 1、文件扩展名由 .c 变成 .cpp .cc .C .cxx 2、编译器由gcc变成ggcc也可以继续使用需要增加编译参数 -xC -lstdc 3、C语言的标准头文件不带.hiostream意为in out stream在C中输入、输出被封装成了流操作(数据流)C语言的头文件还可以继续使用但是标准C的头文件建议名字换成前面加c 后缀去掉的新名字 例如 cstdio为了删除原C标准头文件中的大量的宏重新放入名字空间中防止命名冲突 4、C输入、输出 cout 用于输出 cin 用于输入 不需要占位符会自动识别数据类型 printf/scanf 属于C标准库中的函数 cout/cin 是C标准库中的类对象 //不是函数 5、增加了名字空间机制是C为了解决命名冲突而发明的一项机制 三、C与C数据类型的不同 1、结构的不同 a、不再需要通过typedef来缩短结构类型名在C中设计好结构后定义结构类型时不再需要使用struct关键字了 b、结构中可以有成员是成员函数、成员变量结构变量、结构指针使用 . 和 - 访问成员如果是成员函数那么可以直接访问同结构中的任何成员不需要.和- c、结构中有一些隐藏的成员函数构造函数、析构函数、拷贝构造、赋值操作 d、结构可以继承其它结构也可以被其他结构所继承 e、可以给成员赋予访问控制属性 public 公开的(默认) protected 保护的 结构内和继承了它的结构中能使用 private 私有的 只有结构中才能使用 2、联合的不同 a、不再需要通过typedef来缩短联合类型名在C中设计好联合后定义联合类型时不再需要使用union关键字了 b、联合中可以有成员是成员函数、成员变量联合变量、联合指针使用 . 和 - 访问成员如果是成员函数那么可以直接访问同联合中的任何成员不需要.和- c、联合中有一些隐藏的成员函数构造函数、析构函数、拷贝构造、赋值操作 d、可以给成员赋予访问控制属性 public 公开的(默认) protected 保护的 联合内和继承了它的联合中能使用 private 私有的 只有联合中才能使用 3、枚举的不同 a、不再需要通过typedef来缩短枚举类型名在C中设计好枚举后定义枚举类型时不再需要使用enum关键字了 b、C编译器会对枚举的值进行检查如果不符合就报错只能给名字 c、C语言使用整型来模拟的C中的枚举类型是一种真正的数据类型所以不能与整型进行隐式类型转换了 4、布尔类型的不同 a、C中有真正的布尔类型bool、true、false 是C的关键字不再需要包含 stdbool.h 头文件 b、true、false 在C中是1字节而C语言是4字节(int) //bool不是C语言的关键字 所以写c需要导入头文件 注意无论C还是Cbool类型变量只能存储0|1 5、字符串的不同 a、C中的字符串被封装成了 string 类可以与C语言的字符串进行转换 b、string类被封装在 string 文件并属于std名字空间但是string已经被iostream包含 c、使用string类可以通过运算符的方式直接操作字符串但是C语言string.h中的str系列函数也可以继续使用 strcpy strcat strcmp 相同为真 size() \ length() strlen 只算字符个数 d、C中没有规定string类必须以\0结尾编译器在实现时可以在结尾加上\0也可以不加由编译器决定因为string是一个类它的长度信息已经被封装记录在私有成员变量中了 6、void*的不同 在C语言中void*类型可以与任意类型的指针进行自动转换 在C中void*类型不可以自动转换成其他任意类型的指针如果需要把void*类型的指针赋值给其他类型的指针时必须通过强制类型转换后才能赋值为了提高指针数据类型的安全性 但是其他类型的指针还是可以自动转换成void*类型的指针因为C语言标准库、系统函数中采用了大量的void*类型作为参数如果不保留这个方式会导致C在调用这些函数时非常麻烦 int* p (int*)malloc(4); 四、名字空间 1、为什么需要名字空间 由于C完全兼容C语言C标准库中自带大量的类、函数、宏而且支持继承语法导致全局的标识符大量增加因此命名冲突的概率极大的增加因此名字空间就是为了解决命名冲突 2、什么是名字空间 是C中一种对命名空间进行逻辑划分的一种技术 namespace xxx { 变量; 函数; 结构、联合、枚举; 类; ... } 定义了名字空间后形成了一个相对封闭的作用域空间 3、如何使用 1、直接导入 using namespace xxx; 之后就可以直接使用名字空间中的所有内容虽然方便实际工作中不建议 2、域限定符 :: xxx::标识符 4、名字空间可合并 名字空间可以被多次定义不同位置的名字空间编译器会在编译时自动合并 a.cpp namespace n1{int a;} b.cpp namespace n1{int b;} main.cpp using namespace n1;// 会把a、b都导入进来 5、名字空间中的声明和定义可以分开 a.h namespace n1{ extern int num; } a.cpp int n1::num; 注意可以分开定义但是必须加上 名字空间名::变量名 6、匿名名字空间 所有全局标识符都归属于同一个名字空间称为匿名名字空间可以通过 ::全局标识符 来指定访问匿名名字空间中的内容 例如同名的全局变量被同名局部变量屏蔽后可以以此指定访问全局变量 7、名字空间可以嵌套 namespace n1{int num 10;namespace n2{int num 20;namespace n3{int num 30; }} } 采用逐层分解访问 n1::n2::n3::num 导入指定层的名字空间 using namespace n1::n2; 8、可以给名字空间的名字取别名 namespace n123 n1::n2::n3 五、C的堆内存管理 1、语法格式 类型* p new 类型名; new 分配内存相当于C语言的malloc delete p; delete 释放内存 相当于C语言的free(p) 2、new 允许在分配内存时直接初始化内存 类型* p new 类型名(val); int* p new int(10); 3、new/delete 不能与 malloc/free 混合使用 int* p new int; free(p); 虽然语法允许但是不能这样混合使用 因为使用new分配内存时会自动调用结构、联合、类类型的构造函数使用delete释放内存时会自动调用结构、联合、类类型的析构函数 但是malloc和free都不会调用如果混用就会导致构造、析构没有对应调用 4、连续内存的申请和释放 类型* p new 类型名[个数]; int* p new int[10];//10个int类型的连续堆内存40字节 new[] 会多次调用构造函数 delete[] p; delete[]专门用于释放通过 new[] 申请出来的内存 delete[]也会多次调用析构函数 注意malloc/free new/delete new[]/delete[] 都不能混用 注意通过new[]为结构、联合、类类型申请的内存的前4字节[-1]中记录了申请的次数这样就可以让编译器知道需要调用多少次构造函数和析构函数 5、重复释放问题 delete可以释放空指针但是也不能重复释放其他有效地址与free一致 6、内存分配失败 malloc分配内存失败会返回NULL new分配内存失败会抛出一个异常std::bad_array_new_length如果不接异常并处理那么会终止 7、返回值类型不同 malloc返回一个void*类型的指针 new返回一个对应类型的指针 malloc/free 和 new/delete 的区别 身份(本质) 函数 关键字/运算符 返回值 void* 对应类型的指针 参数 字节个数(手动计算) 类型(自动计算字节个数) 连续内存 手动计算总字节数 new[个数] 扩容 realloc 无法直接处理 失败 返回NULL 抛异常 构造\析构 不调用 调用 初始化 不能初始化 可以初始化 头文件 stdlib.h 不需要 函数重载 不允许重载 允许 内存分配的位置 堆内存 自由存储区 注意自由存储区是一个抽象的概念而不是具体某个位置段平时一般称new是分配在堆内存也问题不大因为new底层默认调用了malloc所以此时称分配在堆内存没问题但是new可以像运算符一样被程序员重载或借助 new(地址) 类型 两种方式分配内存时可以分配到其他内存段所以称为自由存储区