IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-12 23:15:23  更:2021-10-12 23:16:57 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码