5 新的关键字

动态内存分配

回想C语言中,动态内存是怎么分配的?通过C库里面的malloc free去进行动态内存分配。
C++通过new关键字进行动态内存申请,动态内存申请是基于类型进行的。
delete 关键字用于内存释放。

//变量申请
type* pointer = new type;
delete pointer;//数组申请
type* pointer = new tyep[10];
delete[] pointer;
//数组释放一定要加 []
int *p = new int[10];
//.......
delete p;//会造成内存泄漏。这句话的意思是告诉编译器只释放p指向的一个int型空间,而不是所有的数组空间。
delete [] p;//正确的写法

new关键字与malloc函数的区别

  • new关键字是c++的一部分,malloc是由c库提供的函数。
  • new以具体类型为单位进行内存分配,而malloc只能以字节为单位进行内存分配。
  • new在申请单个类型变量时可进行初始化,malloc不具备内存初始化的特性。
#include <stdio.h>int main()
{int* a = new int(6);float* b = new float(7.0);char* c = new char('c');printf("*a = %d, *b = %f, *c = %c\n", *a, *b, *c);delete a;delete b;delete c;return 0;
}

C++中命名空间

在C语言中,只有一个全局作用域。C语言中所有的全局标识符共享同一个作用域,那么项目很大时,标识符之间就有可能发生冲突。
C++中提出了命名空间的概念。目的是将全局作用域划分为不同的块。
命名空间定义:
namespace name { //}

#include <stdio.h>
namespace First
{int i = 0;
}
namespace Second
{int i = 1;namespace Internal{struct P{int x;int y;};}
}int main()
{return 0;
}

命名空间的使用

使用整个命名空间: using namespace name;
使用命名空间中的变量:using name::variable
使用默认命名空间中的变量:::variable
默认情况下,可以直接使用默认命名空间中所有的标识符。

#include <stdio.h>
namespace First
{int i = 0;
}
namespace Second
{int i = 1;namespace Internal{struct P{int x;int y;};}
}int main()
{using namespace First;//告诉编译器,解开First域using Second::Internal::P;//告诉编译器要用Second空间中Internal空间中的P成员变量。printf("i = %d\n", i);//打印0,使用的是First 空间中的i。因为我们没有解开Second 空间printf("i = %d\n", Second::i);//打印1,告诉编译器访问的是Second 空间中的i。P p = {2, 3};printf("p.x=%d, p.y=%d\n", p.x, p.y);return 0;
}

在这里插入图片描述

强制类型转换

C方式的强制类型转换(type)(expression) or type(expression)

#include <stdio.h>
//定义一个函数指针
typedef void(PF)(int);struct Point
{int x;int y;
};int main()
{int v = 0x12345;//将变量v强制类型转换为函数指针PF* pf = (PF*)v;//将变量v强制类型转换为char型char c = char(v);//调用v变量强制转换为函数的地址函数,此处不一定是函数。pf(v);//将v变量强制转换为结构体指针。Point* p = (Point*) v;printf("p->x = %d\n", p->x);printf("p->y = %d\n", p->y);
}

在这里插入图片描述

C强制类型转换过于粗暴,任意类型之间都可以进行转换,编译器很难判断其正确性;且在源码中无法快速定位所有使用强制类型转换的语句,出现问题时难以定位。
在现代软件工程中,最难定位问题的三种问题:
1.强制类型转换。
2.多线程的交互。
3.位运算优先级,数学运算、逻辑运算混在一起。
在程序设计理论中,强制类型转换也是不被推荐的,与goto语句一样,尽量避免。
C++提供了更安全的强制类型转换。将强制类型转换分为4中不同的类型。static_cast const_cast dynamic_cast reinterpret_cast 。用法xxx_cast<type>(expression)

static_cast

  • 用于基本类型间的转换,但不能用于基本类型指针间的转换
  • 用于有继承关系类对象之间的转换和类指针之间的转换。
#include <stdio.h>int main()
{int i = 8;char c = 'B';int* pi = &i;char * pc = &c;c = static_cast<char>(i);pc = static_cast<char*>(pi);	return 0;
}

在这里插入图片描述
static_cast是编译期进行转换的,无法在运行时检测类型。所以类类型之间的转换可能存在风险。

const_cast

  • 用于去除变量的const属性
#include <stdio.h>int main()
{//const 引用j,初始化的时候j就是一个只读变量。//注意第二节讲到 const引用只有定义的别名拥有只读属性,不会影响到正名const int& j = 1;//将只读变量j的const属性去掉,j就降级为普通变量。int& k = const_cast<int&>(j);//声明一个真正的常量x。const int x = 2;//由于对x常量取引用,前面学习了,引用本身就是地址别名,是指针。//所以此处编译器会为这个常量分配一个空间。//y就指向了常量x的地址,y就变成了普通变量。int& y = const_cast<int&>(x);//将j的值改为6k = 6;//j 和 k的值一致。printf("j = %d,k = %d\n", j, k);//将x的变量改成8y = 8;//所以x 和 y的地址一样的。//const引用只有定义的别名拥有只读属性,不会影响到正名,所以x的值还是2,因为是常量,编译器直接替换。printf("x = %d, y = %d\n", x, y);printf("&x = %p, &y = %p\n", &x, &y);return 0;
}

在这里插入图片描述
上面程序中运用到了第二节的知识点:const 常量只有定义的别名拥有只读属性,不会影响到正名。
int& y = const_cast<int&>(x);在解除const属性时,会为x分配内存空间,此时引用y指向这段编译器为x分配的空间,引用y就是普通变量。但是x还是常量,编译器依然认为其不能被赋值。假如下面有一段语句x=8;则编译器还是会报错。

reinterpret_cast

  • 用于指针类型间的强制类型转换
  • 用于整数和指针类型间的强制转换
    reinterpret_cast直接从二进制位进行复制,是一种及其不安全的转换。
#include <stdio.h>typedef void (PF)(int);int main()
{int i = 0;char c = 'C';//将字符变量c的地址强制转换为int型指针,并且赋值给pi指针。int* pi = reinterpret_cast<int*>(&c);//将int变量i的地址强制转换为char型指针,并赋值给pc指针。char* pc = reinterpret_cast<char*>(&i);//将0x888888地址,强制转换为PF型函数指针,并赋值给pf指针。PF* pf = reinterpret_cast<PF*>(0x888888);//将int类型变量转换为char,不是用reinterpret_cast,而是static_castc = reinterpret_cast<char>(i);return 0;
}

在这里插入图片描述

dynamic_cast

  • 主要用于类层次间的转换,还可以用于类之间的交叉转换
  • 具有运行时类型检查的功能,比static_cast更安全

类是什么?对象是什么?类层次是什么?

小结:

  • C++中内置了动态内存分配的专用关键字
  • C++中的动态内存分配是基于类型进行的,C的malloc函数是基于字节为单位分配。
  • C++中命名空间的概念用于解决符号名相同的冲突问题。
  • C++细化了C语言中强制类型转换方式。C++不推荐在程序中使用强制类型转换;建议在强制类型转换时考虑一下究竟希望什么样的转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mistral 7B 比Llama 2更好的开源大模型 (一)

Mistral 7B 简介 Mistral 7B Mistral 7B 是一个 7.3B 参数模型: 在所有基准测试中优于 Llama 2 13B在许多基准测试中优于 Llama 1 34B接近 CodeLlama 7B 的代码性能,同时保持擅长英语任务使用分组查询注意力 (GQA) 加快推理速度使用滑动窗口注意力 (SWA) 以更低的成本处…

[Android]新建项目使用AppCompatActivity后运行闪退

报错 日志&#xff1a; Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity. FATAL EXCEPTION: main Process: com.example.gatestdemol, PID: 26071 java.lang.RuntimeException: Unable to start a…

DefaultListableBeanFactory

DefaultListableBeanFactory 是一个完整的、功能成熟的 IoC 容器&#xff0c;如果你的需求很简单&#xff0c;甚至可以直接使用 DefaultListableBeanFactory&#xff0c;如果你的需求比较复杂&#xff0c;那么通过扩展 DefaultListableBeanFactory 的功能也可以达到&#xff0c…

Netty实现通信框架

一、LengthFieldBasedFrameDecoder的参数解释 1、LengthFieldBasedFrameDecoder的构造方法参数 看下最多参数的构造方法 /*** Creates a new instance.** param byteOrder* the {link ByteOrder} of the length field* param maxFrameLength* the maximum len…

Redis快速入门(基础篇)

简介&#xff1a; 是一个高性能的 key-value数据库。 存在内存中 与其他 key-value 缓存产品有以下三个特点&#xff1a; Redis支持数据的持久化&#xff0c;可以将内存中的数据保持在磁盘中&#xff0c;重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类…

nodejs+vue+python+PHP+微信小程序-安卓- 电影在线订票系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

uniapp: 实现pdf预览功能

目录 第一章 实现效果 第二章 了解并解决需求 2.1 了解需求 2.2 解决需求 2.2.1 方法一 2.2.2 方法二 第三章 资源下载 第一章 实现效果 第二章 了解并解决需求 2.1 了解需求 前端需要利用后端传的pdf临时路径实现H5端以及app端的pdf预览首先我们别像pc端一样&#…

分类预测 | Matlab实现PSO-BiLSTM粒子群算法优化双向长短期记忆神经网络的数据多输入分类预测

分类预测 | Matlab实现PSO-BiLSTM粒子群算法优化双向长短期记忆神经网络的数据多输入分类预测 目录 分类预测 | Matlab实现PSO-BiLSTM粒子群算法优化双向长短期记忆神经网络的数据多输入分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现PSO-BiLSTM粒子…

详解IP安全:IPSec协议簇 | AH协议 | ESP协议 | IKE协议

目录 IP安全概述 IPSec协议簇 IPSec的实现方式 AH&#xff08;Authentication Header&#xff0c;认证头&#xff09; ESP&#xff08;Encapsulating Security Payload&#xff0c;封装安全载荷&#xff09; IKE&#xff08;Internet Key Exchange&#xff0c;因特网密钥…

【java:牛客每日三十题总结-7】

java:牛客每日三十题总结 总结如下 总结如下 执行流程如下&#xff1a;创建HttpServlet时需要覆盖doGet()和doPost请求 2. request相关知识 request.getParameter()方法传递的数据&#xff0c;会从Web客户端传到Web服务器端&#xff0c;代表HTTP请求数据&#xff1b;request.…

【电路笔记】-戴维南定理(Thevenin‘s Theorem)

戴维南定理&#xff08;Thevenin’s Theorem&#xff09; 文章目录 戴维南定理&#xff08;Thevenins Theorem&#xff09;1、概述与定义2、戴维南模型确定3、一些线性电路的戴维南模型3.1 单电压源3.2 单电流源3.3 多电流/电压源 4、结论 在本文中&#xff0c;我们将介绍一种强…

开发vue3 UI组件库,并且发布到NPM

目录 1.创建vue3工程 2.创建package文件 3.编写组件&#xff0c;并且导出 4.编写package.json 5.npm账号注册登录并发布 6.从npm安装使用 7.注意事项 1.创建vue3工程 &#xff08;1&#xff09;初始化Vue项目 cnpm create vite &#xff08;2&#xff09;进入文件夹…

设计模式之原型模式(Prototype)

原型模式 如果已经有一个对象了&#xff0c;你想创建一个对象&#xff0c;而且对象里面的属性和已经存在的对象的属性差不多&#xff0c;就可以使用clone方法 克隆一个出来 实现原型模式需要实现标记型接口Cloneable -->标记型接口 : 里面没有需要实现的方法(空接口) 一般…

数据运营基础:用户场景营销

一、概述 场景营销模型是顶层模型&#xff0c;是站在用户经营和用户场景角度来制定经营策略的模型。本质上&#xff0c;场景营销模型是在用户使用产品的每个细分场景中通过分析用户需求整合功能、实体和体验等为用户提供服务的模型。 二、场景的起源和特点 数据运营体系在发展…

RHCE第四次作业

题目 架设一台NFS服务器&#xff0c;并按照以下要求配置 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 2、开放/nfs/upload目录&#xff0c;为192.168.100.0/24网段主机可以上传目录&#xff0c; 并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3、将…

ChatGPT重磅升级 奢侈品VERTU推出双模型AI手机

2023年11月7日,OpenAI举办了首届开发者大会,CEO Sam Altman(山姆奥尔特曼)展示了号称“史上最强”AI的GPT-4 Turbo。它支持长达约10万汉字的输入,具备前所未有的长文本处理能力,使更复杂的互动成为可能。此外,GPT-4 Turbo还引入了跨模态API支持,可以同时处理图片、视频和声音,从…

Three.js——基于原生WebGL封装运行的三维引擎

文章目录 前言一、什么是WebGL&#xff1f;二、Three.js 特性 前言 Three.js中文官网 Three.js是基于原生WebGL封装运行的三维引擎&#xff0c;在所有WebGL引擎中&#xff0c;Three.js是国内文资料最多、使用最广泛的三维引擎。既然Threejs是一款WebGL三维引擎&#xff0c;那么…

基于YOLOv8的输电线路异物识别算法应用

基于 YOLOv8 的输电线路异物识别算法应用 输电线路作为电力系统的重要一环&#xff0c;保证其安全稳定运行是十分必要的。由于长期暴露于室外&#xff0c;线路所面临的不安全因素繁多&#xff0c;异物入侵便是其中之一。异物可能会引起线路短路甚至诱发火灾&#xff0c;因此要加…

Unity中雾效的实现方法二

文章目录 前言一、声明雾效所需要的内置变体二、在 v2f 中声明顶点传入片段中的雾效插值器三、 在顶点着色器中计算雾效采样四、在片元着色器中进行雾效颜色混合在这里插入图片描述 五、最终效果 前言 Unity中雾效的实现方法二&#xff0c;使用 Unity 自带的方法实现&#xff…

如何将系统盘MBR转GPT?无损教程分享!

什么是MBR和GPT&#xff1f; MBR和GPT是磁盘的两种分区形式&#xff1a;MBR&#xff08;主引导记录&#xff09;和GPT&#xff08;GUID分区表&#xff09;。 新硬盘不能直接用来保存数据。使用前应将其初始化为MBR或GPT分区形式。但是&#xff0c;如果您在MBR时需…