| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 学习日记week11 -> 正文阅读 |
|
[C++知识库]学习日记week11 |
一、C++介绍 ? ? 本贾尼·斯特劳斯特卢普,1979年4月在贝尔实验室在分析UNIX系统的内核流量时,特别希望有一款更加模块化的工具,与1979年10月开始着手开发改进一款新的编程语言,在C语言基础上增加了面向对象机制,1983年完成了C++的第一个版本 ? ? C++与C的重要的区别: ? ? ? ? 1、C++完全兼容C的所有内容 ? ? ? ? 2、支持面向对象的编程思想 ? ? ? ? 3、支持运算符重载、函数重载的编译时多态机制 ? ? ? ? 4、支持泛型编程、模板编程 ? ? ? ? 5、支持异常处理 ? ? ? ? 6、类型的检查更严格 ? ? 注意:学习C++重点学习的是面向对象的编程思想,而不是花时间学习花里胡哨的语法 ? ? 二、第一个C++的程序 ? ? #include <iostream> ? ? using namespace std; ? ? int main(int argc,const char* argv) ? ? { ? ? ? ? cout << "Hellow World" << endl; ? ? ? ? return 0; ? ? } ? ? 1、C++文件扩展名由.c 变成 .cpp .cc .C .cxx ? ? 2、编译器由gcc变成g++,gcc也可以继续使用,需要加编译参数 -xC++, -lstdc++ ? ? 3、C++语言的头文件都不带.h,isstream 意味in out stream,在C++中输入、输出封装成了流操作,C语言的头文件还可以继续使用,但建议文件名前面加c,并且把后面的.h去掉,因为不带.h的C语言头文件中删除了大量的不需要的宏 ? ? 4、输入 ? ? ? ? cout >> 用于输出 ? ? ? ? cin >> ?用于输入 ? ? ? ? 不需要占位符,能够自动识别数字类型 ? ? ? ? printf/scanf ? ?是C语言标准库函数 ? ? ? ? cout/cin ? ? ? ?是C++标准库中的类对线 ? ? 5、c++增加了名字空间、是C++为了解决命名冲突而发明的一项技术 三、C++与C数据类型不同: ? ? 1、结构的不同 ? ? ? ? a、不再需要使用typedef类型重定义,结构设计好后,定义结构变量时不再需要struct关键字 ? ? ? ? b、结构体中的成员可以是函数,称为结构成员函数,结构变量、指针依然使用.或者->访问成员函数,成员函数可以直接访问成员变量,不需要.或者-> ? ? ? ? C、里面有一些隐藏的成员函数(构造,析构,拷贝构造,赋值函数) ? ? ? ? d、可以继承其他的结构体,也可以被其他结构继承 ? ? ? ? e、可以给成员设置访问属性 ? ? ? ? ? ? public ? ? ?公开的(默认) ? ? ? ? ? ? protected ? 保护的 ? ? ? ? ? ? private ? ? 私有的 ? ? 2、联合的不同 ? ? ? ? a、不再需要使用typedef类型重定义,结构设计好后,定义联合变量时不再需要union关键字 ? ? ? ? b、结构体中的成员可以是函数,称为结构成员函数,结构变量、指针依然使用.或者->访问成员函数,成员函数可以直接访问成员变量,不需要.或者-> ? ? ? ? c、里面有一些隐藏的成员函数(构造,析构,拷贝构造,赋值函数) ? ? ? ? d、可以给成员设置访问属性 ? ? ? ? ? ? public ? ? ?公开的(默认) ? ? ? ? ? ? protected ? 保护的 ? ? ? ? ? ? private ? ? 私有的 ? ? 3、枚举的不同 ? ? ? ? a、不再需要使用typedef类型重定义,结构设计好后,定义联合变量时不再需要enum关键字 ? ? ? ? b、是一种独立的数据类型,不能与整型进行隐式转换 ? ? 4、bool类型的不同 ? ? ? ? a、C++中有真正的bool类型,bool是C++中的关键字,不需要包含stdbool.h头文件 ? ? ? ? b、true、false也是C++的关键字,而在C语言中不是 ? ? ? ? b、true、false也是C++中都是1字节,而在C语言中是4字节,但布尔类型变量都是1字节 ? ? ? ? 注意:无论是C还是C++中的bool类型变量。只能存储0 | 1 ? ? 5、字符串的不同 ? ? ? ? a、C++中的字符串被封装成了string类,但是可以与C语言的字符串进行转换 ? ? ? ? b、string类被封装宰了string头文件中,但是该头文件被包含在了iostream中,属于std的名字空间 ? ? ? ? c、使用string字符串,可以用运算符的方式操作字符串,但依然可以使用string.h中的函数 ? ? ? ? ? ? = ? ? ? <-> ? ? strcpy ? ? ? ? ? ? += ? ? ?<-> ? ? strcat ? ? ? ? ? ? == ? ? ?<-> ? ? strcmp ? ? ? ? ? ? .size ? <-> ? ? strlen ? ? ? ? ? ? .c_str ?把string字符串转成C语言字符串类型 ? ? 6、void*的不同 ? ? ? ? C语言中,void*可以去任意类型的指针进行转换 ? ? ? ? 而在C++中,void*不可以自动转换成其他类型的指针,如果需要赋值给其他类型的指针,可以通过强制类型转换后赋值,为了提高指针的安全性 ? ? ? ? 但是其他类型的指针时可以转换成void*类型,C++之所以保留该功能,是因为C语言标准库、操作系统接口函数采用了大量的void*作为函数的参数,如果不保留该功能,C++在调用这些函数时会非常麻烦 四、名字空间 ? ? 1、为什么要使用名字空间 ? ? ? ? 由于C++需要完全兼容C语言,标准库中自带大量的类、函数、而且还支持继承语法,导致全局的标识符大量的增加,因此命名冲突的风险就打打增加 ? ? 2、什么是名字空间 ? ? ? ? 是C++中设计的一种对命名空间进行逻辑划分单位的技术,目的是为了解决命名冲突 ? ? ? ? namespace xxx{ ? ? ? ? ? ? 变量; ? ? ? ? ? ? 函数; ? ? ? ? ? ? 结构、联合、枚举; ? ? ? ? ? ? 类; ? ? ? ? } ? ? ? ? 定义的名字空间就形成了一个封闭的作用域 ? ? 3、如何使用 ? ? ? ? a、直接全部导入 ? ? ? ? ? ? using namespace xxx; ? ? ? ? ? ? 这样可以直接使用该名字空间中的所有内容,虽然很方便,但是不推荐使用这种方法 ? ? ? ? b、域限定符 ? ? ? ? ? ? xxx::标识符 ? ? 4、名字空间的合并 ? ? ? ? 名字空间可以定义多次,会把不同位置的同名名字空间自动合并 ? ? ? ? a.cpp ? ? ? ? using namespace n1{ ? ? ? ? ? ? ... ? ? ? ? } ? ? ? ? b.cpp ? ? ? ? using namespace n1{ ? ? ? ? ? ? ... ? ? ? ? } ? ? ? ? main.cpp ? ? ? ? using namespace n1;//会把a.cpp和b.cpp中n1的标识符全部导入main.cpp ? ? 5、声明和定义可以分开 ? ? ? ? a.h ? ? ? ? namespace n1{ ? ? ? ? ? ? extern int num; ? ? ? ? } ? ? ? ? a.cpp ? ? ? ? int n1::num; ? ? ? ? 注意:在定义时需要使用域限定符 ? ? 6、匿名空间 ? ? ? ? 所有的全局标识符都属于同一个名字空间,如果没有指定,则默认属于匿名空间,匿名空间中的成员可以通过 :: 来访问 ? ? ? ? ? ? 例如:全局变量屏蔽同名全局变量后,可以使用::变量名来指定使用全局变量 ? ? ? ? 7、名字空间可以嵌套 ? ? ? ? namespace n1{ ? ? ? ? ? ? int num = 1; ? ? ? ? ? ? namespace n2{ ? ? ? ? ? ? ? ? int num = 2; ? ? ? ? ? ? ? ? namespace n3{ ? ? ? ? ? ? ? ? ? ? int num = 3; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? 采用逐层分解的方式使用: ? ? ? ? ? ? n1::n2:n3::num; ? ? ? ? 也可以采用导入指定层的名字空间 ? ? ? ? ? ? using namespace n1::n2::n3; ? ? ? ? 8、给名字空间取别名 ? ? ? ? namespace n132 = n1::n2::n3; 五、C++中的堆内存管理 ? ? 1、C++中有专门管理堆内存的语句,而C语言中只能使用标准库提供的函数 ? ? ? ? new ? ? ? ? 分配内存,相当于C语言中的malloc ? ? ? ? delete ? ? ?释放内存,相当于C语言中的free ? ? 2、new在分配内存时允许对内存进行初始化 ? ? ? ? int* p = new int(val); ? ? 3、new/delete 不能与malloc/free 混合使用 ? ? ? ? int* p = new int; ? ? ? ? free(p); ? ?//虽然语法支持,但是不要这样使用 ? ? ? ? 使用new分配内存时会自动调用类、结构、联合的构造函数,而delete会自动调用他们的析构函数,malloc/free做不到 ? ? 4、数组的分配与释放 ? ? ? ? new 类型[个数] ?相当于连续分配多块相同类型的内存,类似于calloc ? ? ? ? 本质就是在内存分配了一个数组,并且它会自动调用构造函数 ? ? ? ? delete[] xxx ? ?专门用于释放new[]所申请的内存,并且它会自动调用析构函数 ? ? ? ? 注意:new/delete malloc/free new[]/delete[] 不要混用 ? ? ? ? 使用new[]为结构、类、联合申请堆内存时,会在该段内存的前4个字节记录构造函数的调用次数,这样可以让编译器知道应该调用多少次析构函数 ? ? 5、重复释放 ? ? ? ? delete可以释放空指针,但是不能重复释放,这点和free一致 ? ? 6、内存分配失败 ? ? ? ? malloc分配失败则会返回NULL ? ? ? ? new分配失败则会抛出一个异常 std::bad_alloc 然后终止程序 ? ? 7、new和malloc的返回值 ? ? ? ? malloc返回一个void*类型的指针 ? ? ? ? new返回一个有类型的指针 ? ? 重点掌握: ? ? ? malloc/free ? ? 与 ? ? ? new/delete 的区别 ? ? ? ? 身份: ? ? 函数 ? ? ? ? ? ? ? ? ?运算符/关键字 ? ? ? ? 返回值: ? ?void* ? ? ? ? ? ? ? ? ? 带类型的指针 ? ? ? ? 参数: ? ? 字节个数(手动计算) ? ? ? 类型(自动计算出字节数) ? ? ? ? 失败: ? ? 返回NULL ? ? ? ? ? ? ?抛出异常std::bad_alloc ? ? ? ? 构造/析构: ?不调用 ? ? ? ? ? ? ? ? 自动调用 ? ? ? ? 初始化: ? ?不能初始化 ? ? ? ? ? ? ? 可以初始化为特定值 ? ? ? ? 头文件: ? ?包含头文件 ? ? ? ? ? ? ? 直接使用 ? ? 面试题:现在有一块内存,如何让类、结构对象使用这块内存 ? ? ? ? 可以通过new来实现 ? ? ? ? int arr[28]; ? ? ? ? Student* stu = new(arr) Student; ? ? ? ? 用处:底层内存管理是C语言,上层实现使用C++要使用底层内存 六、函数重载 ? ? 1、什么是函数重载 ? ? ? ? 在同一作用域下,函数名相同,参数列表不同(参数的个数、类型)的函数构成重载关系 ? ? ? ? 函数重载与返回值类型、参数名无关 ? ? 2、C++如何实现函数重载的 ? ? ? ? 通过g++ -S xxx.cpp 生成的xxx.s汇编代码分析可知,编译器在汇编时把函数的参数类型追加到函数名末尾,从而达到换名的目的,因此能够让函数重载 ? ? 3、extern "C" ? ? ? ? 因为C++编译在编译函数调用语句时,会找换名后的函数调用,这样就无法调用到C编译器编译的函数,因为C编译器编译函数时没有这个换名操作 ? ? ? ? 使用 extern "C" 会让C++编译器按照C语言的格式翻译函数名。这样函数的声明与定义就匹配,才可以正确的调用C中的函数:标准库、系统库中的函数 ? ? 4、重载和隐藏 ? ? ? ? 只有在同一个作用域下的同名不同参的函数构成重载关系, ? ? ? ? 而不同作用域下的同名函数遵循名字隐藏原则 ? ? 5、参数的类型转换 ? ? ? ? 当调用函数时,编译时会优先调用类型最精准的函数,如果没有任何一个函数完全匹配,则会对参数类型进行提升,而不是直接出错 ? ? ? ? ? ? 注意:整型的char、short 直接提升到int,int之后不能提升 |
|
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图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/19 12:25:09- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |