| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C语言与C++的区别 -> 正文阅读 |
|
[C++知识库]C语言与C++的区别 |
一、C++简介 ? ? 本贾尼·斯特劳斯特鲁普,于1979年4月在贝尔实验室负责分析UNIX系统的内核的流量情况,于1979年10月开始着手开发一种新的编程语言, ? ? 在C语言的基础上增加了面向对象机制,这就是C++的来历,在1983年完成了C++的第一个版本
? ? C++与C的重要区别: ? ? ? ? 1、C++完全兼容C的所有内容 ? ? ? ? 2、C++支持面向对象的编程思想和机制 ? ? ? ? 3、C++支持运算符重载、函数重载等编译时多态机制 ? ? ? ? 4、C++支持泛型编程、模板机制 ? ? ? ? 5、C++支持异常处理 ? ? ? ? 6、C++的类型检查更严格 ? ? 注意:学习C++的重点是学习面向对象这种编程思想,而不是花里胡哨的语法 二、C++的第一个程序 #include <iostream> using namespace std; int main(int argc,const char* argv[]) { ? ? cout << "Hello Would!" << endl; ? ? return 0 } ? ? 1、文件的扩展名由 .c 变成.cpp .cc .C .cxx ? ? 2、编译器由gcc变成g++、但gcc也可以继续编译c++文件,需要增加参数 ?-xC++ -lstdc++ ? ? 3、C++的标准库头文件不带.h ?iostream 意为in out stream ?在C++中输入、输出被封装流操作,C语言中的头文件还可以继续使用, ? ? 但是建议在C标准头文件前加 c 并去掉 .h , 因为这样的头文件中删除了大量不使用的宏,并重新添加到名字空间中,防止在C++中命名 ? ? 冲突 ? ? 4、输入输出 ? ? ? ? cout 用于输出 ? ? ? ? cin ?用于输入 ? ? ? ? 不再需要占位符,会自动识别数据类型 ? ? ? ? printf/scanf 是C语言标准库函数 ? ? ? ? cout/cin 是C++标准库中类对象 ? ? ? ? endl 负责换行 ? ? 5、增加了名字空间机制,是C++为了解决命名冲突而发明的一项机制 三、C++与C数据类型的不同点 ? ? 1、结构的不同 ? ? ? ? a、不再需要 typedef 关键字进行省略 struct ,只需在设计好结构后, 定义结构变量时不再需要struct关键字 ? ? ? ? b、结构中的结构成员可以是成员变量还可以是成员函数,结构变量、结构指针分别使用 . 或 -> 访问成员函数,在成员函数中可以直接 ? ? ? ? 访问本结构的其他成员变量、成员函数、不再需要 . -> ? ? ? ? c、结构中有一些隐藏的成员函数(构造、析构、拷贝构造、赋值函数) ? ? ? ? d、可以给结构成员设置访问属性 ? ? ? ? ? ? public ? ? ?公开的 (默认) ? ? ? ? ? ? protected ? 保护的 ? ? ? ? ? ? ? private ? ? 私有的 ? ? ? ? e、结构是可以继承其他结构,也可以被其他结构继承 ? ? ? ? 2、联合的不同 ? ? ? ? a、不再需要 typedef ?关键字进行省略 ?union ?,只需在设计好结构后, 定义结构变量时不再需要 union 关键字 ? ? ? ? b、联合中的成员可以是成员变量还可以是成员函数,联合变量、联合指针分别使用 . 或 -> 访问成员函数,在成员函数中可以直接 ? ? ? ? 访问本联合的其他成员变量、成员函数、不再需要 . -> ? ? ? ? c、联合中有一些隐藏的成员函数(构造、析构、拷贝构造、赋值函数) ? ? ? ? d、可以给结构成员设置访问属性 ? ? ? ? ? ? public ? ? ?公开的 (默认) ? ? ? ? ? ? protected ? 保护的 ? ? ? ? ? ? ? private ? ? 私有的 ? ? ? ? e、联合不能继承 ? ? 3、枚举的不同 ? ? ? ? a、不再需要 typedef 关键字进行省略 enum ,在设计好枚举后,定义枚举变量时不再需要enum关键字 ? ? ? ? b、是一种独立的数据类型,不能与整型进行自动隐式转换 ? ? 4、bool类型的不同 ? ? ? ? a、C++中有真正的布尔类型,bool 是C++的关键字,不需要包含stdbool.h,可直接使用 ? ? ? ? b、true 、false 也是C++中的关键字,但在C语言中都不是 ? ? ? ? c、true 、false 在C++中是1字节,而在C中是4字节 ? ? ? ? 注意:无论是C还是C++中bool类型都是1字节,且只存储 0|1 ? ? 5、字符串的不同 ? ? ? ? a、C++中的字符串封装成了string类,但还可以使用C中的字符串,且能与string进行相互转换 ? ? ? ? b、string类型被封装在string头文件,但已经被包含到iostream中,属于std名字空间 ? ? ? ? c、可以使用string字符串成员函数,还可以使用运算符的方式操作string类,但是C语言中的 string.h 系列函数还可以继续使用 ? ? ? ? ? ? = ? strcpy ? ? ? ? ? ? += ?strcat ? ? ? ? ? ? == ?strcmp ? ? ? ? ? ? .size() strlen ? ? ? ? ? ? .c_str() ? ?由string转换为char* ? ? ? ? d、C++中没有规定string必须以'\0'为结束标志,编译器可能在末尾加,也可能不加,由编译器决定,因为他的长度信息封装到类的私有 ? ? ? ? 成员中 ? ? ? ? 6、 void* 的不同 ? ? ? ? 在C语言中,void*可以与任何类型的指针进行相互转换;在C++中,void* 不可以自动转换成其他类型的指针,如果需要赋值给其他类型 ? ? ? ? 的指针时,只能强制类型转换后才能赋值,为了提高指针访问内存的安全性考虑 ? ? ? ? 但是其他类型的指针依然可以自动转换成 void* 类型指针,C++之所以保留该功能,是因为C语言标准库、操作系统接口函数采用了 ? ? ? ? 大量的 void* 作为函数,如果不保留该功能,那么C++在调用这些函数时会非常麻烦(mmap/bzero/memcpy/memcmp...) ? ? 四、名字空间 ? ? ? ? 1、为什么需要名字空间 ? ? ? ? C++完全兼容C语言,C标准库中自带了大量的类名、函数名、变量名,所以全局的标识符大量增加,容易导致全局的标识符命名冲突的风险 ? ? ? ? 也大大增加 ? ? ? ? 2、什么是名字空间 ? ? ? ? 是C++中增加的一种对命名空间进行逻辑划分单元的技术,称为名字空间,是一种解决命名冲突的机制 ? ? ? ? namespace xxx{ ? ? ? ? ? ? 变量名; ? ? ? ? ? ? 函数名; ? ? ? ? ? ? 结构、联合、枚举; ? ? ? ? ? ? 类;... ? ? ? ? } ? ? ? ? ? ? 定义出来xxx名字空间形成了一个封闭的作用域 ? ? ? ? 3、如何使用 ? ? ? ? ? ? a、直接全部导入 ? ? ? ? ? ? ? ? using namespace xxx; ? ? ? ? ? ? ? ? 这样在后续代码中直接使用xxx名字空间中的所有内容,虽然很方便,但是不建议这样用 ? ? ? ? ? ? b、域限定符 ? ? ? ? ? ? ? ? xxx::标识符名 ? ? ? ? ? ? ? ? 单次访问名字空间中的标识符 ? ? ? ? 4、名字空间合并 ? ? ? ? ? ? 同名名字空间可以多次定义,不同位置的同名名字空间会自动合并 ? ? ? ? ? ? a.cpp ? ? ? ? ? ? namespace n1{ ? ? ? ? ? ? ? ? xxx ? ? ? ? ? ? } ? ? ? ? ? ? b.cpp ? ? ? ? ? ? namespace n1{ ? ? ? ? ? ? ? ? yyy ? ? ? ? ? ? } ? ? ? ? ? ? main.cpp ? ? ? ? ? ? using namespace n1;//会把a.cpp的xxx和b.cpp的yyy全部导入
? ? ? ? 5、声明和定义可以分开 ? ? ? ? ? ? a.h ? ? ? ? ? ? namespace n1{ ? ? ? ? ? ? ? ? extern int num; // 声明 ? ? ? ? ? ? } ? ? ? ? ? ? a.cpp ? ? ? ? ? ? int n1::num = 88; ? // 定义 ? ? ? ? ? ? 但是注意要加域限定符 ? ? ? ? 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、C++中有专门管理堆内存的语句,而C语言只能使用标准库中的函数malloc/free ? ? C++ ?new/delete (语句) ? ? ? ? ? ? new ? ? ? ? 分配堆内存 ?相当于C语言中的malloc ? ? ? ? ? ? delete ? ? ?释放堆内存 ?相当于C语言中的free ? ? ? ? ? ? 常用格式: 类型* p = new 类型; ? ? ? ? ? ? ? ? ? ? ? int* p = new int; ? ? ? ? 2、new分配内存时可以直接对内存进行初始化 ? ? ? ? ? ? 类型*p = new类型(val); ? ? ? ? 3、new/delete 不能与malloc/free 混合使用 ? ? ? ? ? ? ? int* p = new int; ? ? ? ? ? ? free(p); //语法支持,不应该这样使用 ? ? ? ? ? ? 使用new分配内存时会自动调用结构、联合、类类型的构造函数,而使用delete会自动调用这些类型的析构函数,但是malloc/free ? ? ? ? ? ? 并不会调用构造、析构函数 ? ? ? ? 4、数组的分配和释放 ? ? ? ? ? ? 类型* p = new 类型[数量]; ? ? ? ? ? ? 相当于分配连续的多块相同类型的内存,类似于C中的calloc ? ? ? ? ? ? delete[] 专门用于释放通过new[]方式所申请的内存,并且它会自动多次调用析构函数 ? ? ? ? ? ? 注意: new/delete ? ? malloc/free ?new[]/delete[] ? 必须不能混用 ? ? ? ? ? ? ? ? 如果使用new[]为结构、联合、类申请到的内存前4个字节记录了申请的次数,这样的目的是为了让编译器在delete[]知道 ? ? ? ? ? ? ? ? 应该调用的多少次析构函数 ? ? ? ? 5、重复释放 ? ? ? ? ? ? delete 和 free一样,都可以释放空指针,但是都不能重复释放相同内存 ? ? ? ? 6、内存分配失败 ? ? ? ? ? ? malloc分配失败则返回NULL ? ? ? ? ? ? new 分配失败,则会抛出一个异常std::bad_array_new_length ? ? ? ? 7、new 和 malloc 返回值不同 ? ? ? ? ? ? malloc成功返回void* ? ? ? ? ? ? new 成功返回有类型的指针 ? ? ? ? ? ? #include <iostream> ? ? ? ? ? ? #include <cstdlib> ? ? ? ? ? ? using namespace std; ? ? ? ? ? ? struct Student ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Student() ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? cout << "我是Student的构造函数" << endl; ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ~Student() ? ? ? ? ? ? ? ? { ? ? ? ? ? ? ? ? ? ? cout << "我是Student的析构函数" << endl; ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? }; ? ? ? ? ? ? int main(int argc,const char* argv[]) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? Student* stu = new Student[3]; ? ? ? ? ? ? ? ? int* p = (int*)stu; ? ? ? ? ? ? ? ? cout << p[-1] << endl; ? ? ? ? ? ? // ?free(stu); ? ? ? ? ? ? ? ? delete[] stu; ? ? ? ? ? ? ? ? int* p1 = new int[167]; ? ? ? ? ? ? ? ? cout << p1[-1] << endl; ? ? ? ? ? ? ? ? delete[] p1; ? ? ? ? ? ? ? ? /* ? ? ? ? ? ? ? ? int* p = new int(1234); ? ? ? ? ? ? // ?*p = 100; ? ? ? ? ? ? ? ? cout << *p << endl; ? ? ? ? ? ? // ?delete p; ? ? ? ? ? ? ? ? free(p); ? ? ? ? ? ? ? ? */ ? ? ? ? ? ? } ? ? 重点掌握: ? malloc/free ?和 ?new/delete 的区别 ? ? 身份: ? ? ? 函数 ? ? ? ? ? ? ? ?运算符\关键字 ? ? 返回值: ? ? void* ? ? ? ? ? ? ? 带类型的指针 ? ? 参数: ? ? ?字节个数(手动计算) ? ? 类型 ?自动计算字节数 ? ? ? ? ? ? ? ? 处理数组:手动计算数组总字节数 ? ? ?new 类型[数量] ? ? 扩容: ? ? ? realloc ? ? ? ? ? ? ? ? 不好直接处理 ? ? 失败: ? ? ? 返回NULL ? ? ? ? ? ? ? ?抛异常并结束 ? ? 构造\析构: ?不调用 ? ? ? ? ? ? ? ? ?自动调用 ? ? 初始化: ? ? 不能初始化 ? ? ? ? ? ? ?new 类型(val) ? ? 头文件: ? ? stdlib.h ? ? ? ? ? ? ? 直接使用 ? ? 重载: ? ? ? 不允许重载 ? ? ? ? ? ? ? ?允许 ? ? 分配内存位置:堆内存 ? ? ? ? ? ? ? ? 自由存储区 ? ? 注意:自由存储区只是一个抽象的概念,如果new底层默认调用malloc,此时分配的是堆内存,但是new可以当做运算符被程序员重载 ? ? 或者new(地址)类型的方式分配内存时,可能会被分配到其他任意的区域,取决于括号内的地址是哪个段 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 12:55:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |