当前位置: 首页 > news >正文

标准C++day1——名字空间和堆内存管理

一、C++介绍

    本贾尼.斯特劳斯特卢普,于1979年在贝尔实验室负责分析UNIX系统内核流量的分布情况时,特别希望有一种更加模块化的工具,于1979.10开始着手研发一款新的编程语言,在C语言的基础上增加了面向对象的机制,也就是C++,1983年完成了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变成g++,gcc也可以继续使用,需要增加编译参数

        -xC++ -lstdc++

    3、C++语言的标准头文件不带.h,iostream意为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还是C++,bool类型变量只能存储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(地址) 类型 两种方式分配内存时,可以分配到其他内存段,所以称为自由存储区

相关文章:

标准C++day1——名字空间和堆内存管理

一、C介绍 本贾尼.斯特劳斯特卢普&#xff0c;于1979年在贝尔实验室负责分析UNIX系统内核流量的分布情况时&#xff0c;特别希望有一种更加模块化的工具&#xff0c;于1979.10开始着手研发一款新的编程语言&#xff0c;在C语言的基础上增加了面向对象的机制&#xff0c;也就是C…...

草图大师SketchUp Pro 2023 for Mac

SketchUp Pro 2023 for Mac&#xff08;草图大师&#xff09;是一款专业的三维建模软件&#xff0c;由Trimble Inc.开发。它可以用于创建、修改和分享3D模型&#xff0c;包括建筑、家具、景观等。 SketchUp Pro 2023 for Mac提供了简单易学的用户界面和强大的工具集&#xff0…...

doris docker环境编译部署

1.准备doris docker环境 xiuchenggongxiuchengdeMacBook-Pro bin % docker pull apache/doris:build-env-ldb-toolchain-latestbuild-env-ldb-toolchain-latest: Pulling from apache/doris eeedae70be19: Pull complete a3ed95caeb02: Pull complete Digest: sha256:63d9a9…...

java封装国密SM4为 jar包,PHP调用

java封装国密SM4为 jar包,PHP调用 创建java工程引入SM4 jar包封装CMD可调用jar包PHP 传参调用刚用java弄了个class给php调用,本以为项目上用到java封装功能的事情就结束了,没想到又来了java的加密需求,这玩意上头,毕竟不是强项,没办法,只好再次封装。 但是这次的有点不…...

微信小程序 wx:if使用

在微信小程序中&#xff0c;可以使用wx:if指令来控制某个元素是否需要被渲染到页面上。根据条件表达式的结果&#xff0c;wx:if指令决定元素是否显示。 下面是使用wx:if的基本示例&#xff1a; <view><view wx:if"{{condition}}"><!-- 条件为真时显…...

SpringBoot环境MongoDB分页+去重+获取去重后的原始数据

最近有个比较复杂的MongoDB查询需求&#xff0c; 要求1&#xff1a;获取最近订单表中的请求参数信息&#xff0c;并需要按照请求参数中的账号进行去重 要求2&#xff1a;数据量可能比较大&#xff0c;因此需要做分页查询 研究了大半天&#xff0c;终于搞出了解决方案&#xff0…...

Vuex核心概念 - actions 和 getters

文章目录 actions 和 getters一、actions作用使用目的&#xff1a; 二、actions的使用执行原理代码示例&#xff1a; 三、actions中的辅助函数mapActions代码示例&#xff1a; 四、核心-getters1. 什么是getters&#xff1f;2. getters的作用&#xff1a;3. 访问 getters 的两种…...

51单片机的简易计算器数码管显示仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机的简易计算器数码管显示仿真设计 1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接 51单片机的简易计算器数码管显示仿真设计( proteus仿真程序原理图报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器…...

Qt版本的冷知识

Qt4.8.7是Qt4的终结版本&#xff0c;是Qt4系列版本中最稳定最经典的&#xff08;很多嵌入式板子还是用Qt4.8&#xff09;&#xff0c;其实该版本是和Qt5.5差不多时间发布的。参考链接 https://www.qt.io/blog/2015/05/26/qt-4-8-7-released https://blog.qt.io/blog/2015/07/01…...

[C++ 学习] 控制信号

// // Created by ubuntu on 9/6/23. // #include<iostream> #include<unistd.h> #include <signal.h>using namespace std; void EXIT(int sig){cout << "收到了信号&#xff1a;" << sig << endl;cout << "正在释放…...

php如何设置随机数

第一种方法用mt_rand() 第二种方法&#xff08;最快的&#xff09; 第三种取当时时间戳 第四种打乱字符串 5 //开始创建验证码(直接用函数生成&#xff0c;比较方便快捷) php mt_rand生成0~1随机小数的效果比较 第一种方法用mt_rand() function GetRandStr($length){ $s…...

WebGL 纹理——在矩形表面贴上图像

目录 WebGL要进行纹理映射&#xff0c;需遵循以下四步&#xff1a; 1. 准备好映射到几何图形上的纹理图像。 2. 为几何图形配置纹理映射方式。 3. 加载纹理图像&#xff0c;对其进行一些配置&#xff0c;以在WebGL中使用它。 4. 在片元着色器中将相应的纹素从纹理中抽取出…...

javaweb-Filter-listener过滤器与监听器

这里对Javaweb三大组件 Servelet Filter Listener 的Filter Listener进行学习 即过滤器 与监听器 过滤器: 当web浏览器向服务器发送请求时就可以对请求进行拦截与增强 这里直接给出过滤器的代码 package Filter;import javax.servlet.*; import javax.servlet.annotati…...

DBeaver 常用快捷键【大全】

本文介绍DBeaver 数据库工具的常用快捷键 一、简介 DBeaver 是一款常用的数据库工具&#xff0c;使用快捷键可以提高操作效率。 二、常用快捷键介绍 以下是DBeaver的常用快捷键&#xff1a; 1.ctrlenter 执行sql 2.ctrl\ 执行sql,保留之前窗口结果 3.ctrlshift↑ 向上复制一…...

数据分析之面试题目汇总

1、解释数据清洗的过程及常见的清洗方法。 数据清洗是指在数据分析过程中对数据进行检查、处理和纠正的过程&#xff1b;是数据预处理的一步&#xff0c;用于处理数据集中的无效、错误、缺失或冗余数据 常见的清洗方法包括&#xff1a;处理缺失值、处理异常值、去除重复值、统一…...

【Vue-Element-Admin】级联查询

背景 有两个查询条件&#xff1a;模块、功能点 想实现选择模块后&#xff0c;点击功能点下拉框&#xff0c;查询出对应模块下的功能点列表 查询 listQuery: export default{return{listQuery:{//page:1,//limit:20,//如果想兼容按条件导出&#xff0c;可以定义查询条件age:…...

深入探讨Kubernetes(K8s)在云原生架构中的关键作用和应用

文章目录 1. 容器化的应用程序管理2. 自动化扩展和负载均衡3. 容器编排和调度4. 存储管理5. 自动化滚动更新6. 多云和混合云部署7. 监控和日志8. 安全9. 社区支持和生态系统10. 未来展望案例 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1…...

redis zset score 求和

redis zset score 求和 local sum0 local zredis.call(‘ZRANGE’, KEYS[1], 0, -1, ‘WITHSCORES’) for i2, #z, 2 do sumsumz[i] end return sum 例子&#xff1a;lua ~$ redis-cli zadd z 1 a 2 b 3 c 4 d 5 e (integer) 5 ~$ redis-cli eval "local sum0 local zr…...

springboot属性注入增强(一)背景/需求

一 背景 springboot 在启动时候会将系统的环境变量、项目的启动时设置的属性 、application.yml文件&#xff08;或application.properties文件&#xff09;、PropertySource定义的配置文件中的属性加载到Environment对象中&#xff0c;分布式配置中心框架也会把配置加载到Env…...

《PWA实战:如何为你的网站增加离线功能和推送通知》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...