当前位置: 首页 > 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; 文章图文…...

sqli-labs关卡之一(两种做法)

目录 一、布尔盲注(bool注入) 二、时间盲注(sleep注入) 一、布尔盲注(bool注入) 页面没有报错和回显信息&#xff0c;只会返回正常或者不正常的信息&#xff0c;这时候就可以用布尔盲注 布尔盲注原理是先将你查询结果的第一个字符转换为ascii码&#xff0c;再与后面的数字比较…...

Visual Studio 线性表的链式存储节点输出引发异常:读取访问权限冲突

问题&#xff1a; 写了一个线性表的链式存储想要输出&#xff0c;能够输出&#xff0c;但是会报错&#xff1a;读取访问权限冲突 分析&#xff1a; 当我们输出到最后倒数第二个节点时&#xff0c;p指向倒数第二个节点并输出&#xff1b; 下一轮循环&#xff1a;p指向倒数第二…...

[通用]计算机经典面试题基础篇Day3

[通用]计算机经典面试题基础篇Day3 1、请说明mysql的两种主要引擎 MySQL有多种存储引擎&#xff0c;但最常见的两种主要引擎是InnoDB和MyISAM。 2、说一下mysql这两种引擎的使用场景 MySQL的两种主要引擎&#xff0c;InnoDB和MyISAM&#xff0c;各自适用于不同的使用场景&…...

(Golang) 牛客 在线编程 Go语言入门

文章目录 前言Go的学习资料链接 AC代码01 输出打印GP1 go的第一个程序 02 变量GP2 小明信息GP3 个人信息 03 常量GP4 国家名称 04 指针GP5 值和指针 05 字符串GP6 拼接字符串GP7 字符数量GP8 回文数 06 类型转换GP9 格式化字符串GP10 字符求和 07 运算符GP11 长方形的周长GP12 …...

2.6 PE结构:导出表详细解析

导出表&#xff08;Export Table&#xff09;是Windows可执行文件中的一个结构&#xff0c;记录了可执行文件中某些函数或变量的名称和地址&#xff0c;这些名称和地址可以供其他程序调用或使用。当PE文件执行时Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入&…...

SpringMvc进阶

SpringMvc进阶 SpringMVC引言一、常用注解二、参数传递三、返回值 SpringMVC引言 在Web应用程序开发中&#xff0c;Spring MVC是一种常用的框架&#xff0c;它基于MVC&#xff08;Model-View-Controller&#xff09;模式&#xff0c;提供了一种结构化的方式来构建可维护和可扩…...

SpringCloud Alibaba 入门到精通 - Nacos

SpringCloud Alibaba 常用组件 一、基础结构搭建1.父工程创建2.子工程创建 二、Nacos&#xff1a;注册中心1.服务端搭建2.注册中心-客户端搭建3.注册中心-管理页面4.注册中心-常用配置5.注册中心-核心功能总结 三、Nacos注册中心集成Load Balancer 、OpenFeign1.Nacos客户端集成…...

new/delete, malloc/free

区别&#xff1a; 首先new/delete是运算符&#xff0c;malloc/free是库函数。malloc/free只开辟内存不初始化&#xff1b;new/delete及开辟内存也初始化。抛出异常的方式&#xff1a;new/delete开辟失败使用抛出bad_alloc&#xff1b;malloc/free通过返回值判断。malloc和new区…...

oracle将一个用户的表复制到另一个用户

注&#xff1a;scott用户和scott用户下的源表&#xff08;EMP&#xff09;本身就有&#xff0c;无需另行创建。 GRANT SELECT ON SCOTT.emp TO BI_ODSCREATE TABLE ODS_EMP AS SELECT * FROM SCOTT.emphttp://www.bxcqd.com/news/77615.html SQL语句查询要修改密码的用户…...

C#知识点、常见面试题

相关源码 https://github.com/JackYan666/CSharpCode/blob/main/CSharpCode.cs 0.简要概括 1.For循环删除集合元素可能漏删:从后面往前删除 2.Foreach不能直接修改集合元素:用递归的思想,删除完了的集合重新遍历 3.闭包问题:for循环存在闭包,可以通过使用临时变量解决…...

wordpress商城模板下载/输入关键词搜索

分门别类刷算法&#xff0c;坚持&#xff0c;进步&#xff01; 刷题路线参考&#xff1a;https://github.com/chefyuan/algorithm-base https://github.com/youngyangyang04/leetcode-master/ 大家好&#xff0c;我是老三&#xff0c;一个刷题困难户&#xff0c;接下来我们开始…...

家在深圳坪山业主论坛/网络seo软件

零、前言 最近几天&#xff0c;真的是和迭代器干上了....... 这篇博客&#xff0c;通过简单实现vector中的迭代器&#xff0c;了解迭代器的机制 一、迭代器的设计思想&#xff1a; 为什么要有迭代器&#xff1f; 答&#xff1a;迭代器模式&#xff08;Iterator &#xff0…...

个人网站毕业设计/点金推广优化公司

第二十四讲 SpringBoot下载文件 文章目录第二十四讲 SpringBoot下载文件1.pom.xml 引入依赖2. 前端&#xff1a;fileUpload.html3. 后端&#xff1a;DownloadController.java1.pom.xml 引入依赖 <dependency><groupId>org.springframework.boot</groupId>&l…...

ps怎么做华为网站界面/深圳哪里有网络推广渠避

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01;下面這個方法 你可以用來設置列寬&#xff0…...

做谷歌网站使用什么统计代码吗/怎么做谷歌推广

1. 行内样式 通过 ele.style.styleName 获取 &#xff08;可读写&#xff09; 2. 内联样式和外联样式 // 兼容写法,获取任意元素的css样式 (只读) function getStyle(ele,styleName){if(ele.currentStyle){return ele.currentStyle[styleName];}else{return window.getCompu…...

深圳大浪网站建设/产品怎么在网上推广

1、为什么要使用YARN&#xff1f; 为了提升集群的利用率、资源统一管理&#xff0c; 使用YARN为上层应用提供统一的资源管理和调度的平台。 2、YARN的优势&#xff1f; 资源的统一管理和调度&#xff1a; 集群中所有节点的资源(内存、CPU、磁盘、网络等)抽象为Container。计算…...