侯捷 C++ part2 兼谈对象模型笔记——7 reference、const、new/delete

news2025/1/14 18:42:03

7 reference、const、new/delete

7.1 reference

x 是整数,占4字节;p 是指针占4字节(32位);r 代表x,那么r也是整数,占4字节

int x = 0;
int* p = &x; // 地址和指针是互通的
int& r = x; // 引用是代表x

引用与指针不同,只能代表一个变量,不能改变

引用底部的实现也是指针,但是注意 object 和它的 reference 的大小是相同的,地址也是相同的(是编译器制造的假象)

sizeof(r) == sizeof(x)
&x == &r

reference 通常不用于声明变量,用于参数类型和返回类型的描述

image-20230808091745371

以下 imag(const double& im)imag(const double im) 的签名signature 在C++中是视为相同的——二者不能同时存在

double imag(const double& im) /*const*/ {....}
double imag(const double im){....} //Ambiguity

注意:const 是函数签名的一部分,所以加上后是可以共存的

7.2 const

const 加在函数后面 —— 常量成员函数(成员函数才有):表示这个成员函数保证不改变 class 的 data

const objectnon-const object
const member function(保证不改变 data members)✔️✔️
non-const member function(不保证 data members 不变)✔️

COWCopy On Write

多个指针共享一个 “Hello”;但当a要改变内容时, 系统会单独复制一份出来给a来改,即 COW

image-20230801101907977

在常量成员函数中,数据不能被改变所以不需要COW;而非常量成员函数中数据就有可能被改变,需要COW

charT
operator[] (size_type pos)const
{
	.... /* 不必考虑COW */   
}

reference
operator[] (size_type pos)
{
    .... /* 必须考虑COW */
}

函数签名不包括返回类型但包括const,所以上面两个函数是共存的

当两个版本同时存在时,const object 只能调用 const 版本,non-const object 只能调用 non-const 版本

7.3 new delete

7.3.1 全局重载

  • 可以全局重载 operator newoperator deleteoperator new[]operator delete[]
  • 这几个函数是在 new 的时候,编译器的分解步骤中的函数,是给编译器调用的

注意这个影响非常大!

inline void* operator new(size_t size){....}
inline void* operator new[](size_t size){....}
inline void operator delete(void* ptr){....}
inline void operator delete[](void* ptr){....}

7.3.2 class中成员重载

  • 可以重载 class 中成员函数 operator newoperator deleteoperator new[]operator delete[]
  • 重载之后,new 这个类时,编译器会使用重载之后的
class Foo
{
publicvoid* operator new(size_t size){....}
    void operator delete(void* ptr, size_t size){....} // size_t可有可无
    
    void* operator new[](size_t size){....}
    void operator delete[](void* ptr, size_t size){....} // size_t可有可无
    ....
}
// 这里优先调用 members,若无就调用 globals
Foo* pf = new Foo;
delete pf;

// 这里强制调用 globals
Foo* pf = ::new Foo;
::delete pf;

7.3.3 placement new delete

可以重载 class 成员函数 placement new operator new(),可以写出多个版本,前提是每一个版本的声明有独特的传入参数列,且其中第一个参数必须是 size_t,其余参数出现于 new(.....) 小括号内(即 placement arguments

Foo* pf = new(300, 'c') Foo; // 其中第一个参数size_t不用写
// 对应的operator new
void* operator new (size_t size, long extra, char init){....}

我们也可以重载对应的 class 成员函数 operator delete(),但其不会被delete调用,只当 new 调用的构造函数抛出异常 exception 的时候,才会调用来归还未能完全创建成功的 object 占用的内存

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

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

相关文章

windows电脑简单实时tts语音播报wsay;python pyttsx3语言实时播报text-to-speech;微软edge-tts 音色自然离线不实时

1、wsay 参考: https://github.com/p-groarke/wsay 下载安装: https://github.com/p-groarke/wsay/releases/tag/v1.5.0 下载exe文件,并把加入环境变量就可 使用 # Say something. wsay "Hello there."wsay "你好"…

图书馆管理系统、学生管理系统、交通管理系统(C语言、数据结构、java、Javaweb)

图书馆管理系统作为一个经典的项目,在国家、学校、等每个地方或者作为期末作品都用的非常广泛: C语言程序设计:图书馆管理系统含说明文档。 大一时C综合设计,当时得了96。代码纯原创,可直接运行,包含详细注…

springboot多数据源配置,看这一篇就够了

springboot下多数据源配置实现 不管是两个mysql,还是一个mysql一个oracle,都是一样的操作 目录 springboot下多数据源配置实现配置application.yml文件数据源配置类创建mapper接口创建mapper的xml配置文件 你可能会遇到的问题 配置application.yml文件 …

无涯教程-Perl - study函数

描述 此功能需要花费额外的时间来研究EXPR,以改善在EXPR上执行的正则表达式的性能。如果省略EXPR,则使用$_。实际的速度增益可能非常小,具体取决于您希望搜索字符串的次数。 您一次只能学习一种表达式或标量。 语法 以下是此函数的简单语法- study EXPRstudy返回值 此函数…

Scala 如何调试隐式转换--隐式转换代码的显示展示

方法1 在需要隐式转换的地方,把需要的参数显示的写出。 略方法2,查看编译代码 在terminal中 利用 scalac -Xprint:typer xxx.scala方法打印添加了隐式值的代码示例。 对于复杂的工程来说,直接跑到terminal执行 scalac -Xprint:typer xxx.…

薅羊毛!我用这款AI工具,免费拿下12张漫画头像

今天l1m0_将为大家分享一款AI生图工具,并介绍如何通过Pixso AI,用自己的照片,免费一键生成AI漫画头像,一起来看看吧。 这里我用Pixso资源社区的一组用户头像资源,为大家演示,如何快速生成AI漫画头像。 首先…

小程序开发:如何选择合适的开发工具和平台?

小程序是一种基于微信平台的轻量级应用程序,具有操作简便、体验流畅等优点。然而,对于许多中小企业来说,三五万的开发成本可能过高,让人感到犹豫。 首先,三五万的成本包括了开发人员的费用、服务器费用、推广费用等。对…

JS大纲简介

1 HTML中的JavaScript js引用文件可以放在两个位置&#xff0c;一种是html中的head中&#xff0c;一种是html中的body中&#xff1b;放置在这两个位置&#xff0c;有何区别呢&#xff1f; 1.1 使用<script>元素的方式 1.1.1 放置在 head 中 引用example.js文件&#…

微信公众号扫码实现网站登录-Django+Vue版本-超详细保姆级教程

实现网页端微信扫码登录有三种方式&#xff1a; PlanA&#xff1a;微信开放平台 — 需认证 — 300元PlanB&#xff1a;微信公众号 — 需服务号且已认证 — 300元PlanC&#xff1a;微信小程序 — 需已上线备案的小程序 — 0元 本教程为Djangovue举例的微信公众号扫码登录&#…

.Net程序调试时接受外部命令行参数方式

1.对项目右键&#xff0c;属性 2.在调试中打开常规&#xff0c;打开调试启动配置文件UI 3.输入需要的命令行参数

Vue3 setup中使用$refs

在 Vue 3 中的 Composition API 中&#xff0c;$refs 并不直接可用于 setup 函数。这是因为 $refs 是 Vue 2 的实例属性&#xff0c;而在 Vue 3 中&#xff0c;setup 函数是与模板实例分离的&#xff0c;不再使用实例属性。 实际工作中确实有需求&#xff0c;在setup 函数使用…

Vue实现动态遍历生成el-input

实现效果: el-input的label是measureName, el-input绑定的值是formDatat.measureCode 接口返回的数据格式如下 处理过的formData的格式如下

Java开发工具哪个好,哪些常见

Java开发工具是很重要的存在&#xff0c;选择合适的Java开发工具对于开发人员来说非常重要。一个好的开发工具可以提高开发效率、简化开发流程并提供丰富的功能和工具支持。 以下是动力节点推荐的一些常用且受欢迎的Java开发工具&#xff1a; Eclipse&#xff1a;Eclipse是一款…

在 OpenCV 中使用深度学习进行年龄检测-附源码

文末附完整源码和模型文件下载链接 在本教程中,我们将了解使用 OpenCV 创建年龄预测器和性别分类器项目的整个过程。 年龄检测 我们的目标是创建一个程序,使用图像来预测人的性别和年龄。但预测年龄可能并不像你想象的那么简单,为什么呢?您可能会认为年龄预测是一个回归问…

【idea】社区版idea运行Tomcat

使用 Smart Tomcat插件 配置运行&#xff1a;

JavaScript常见语法--菜鸟教程

文章目录 JavaScript 语法<body> 中的 JavaScript JavaScript 输出使用 window.alert()操作 HTML 元素写到 HTML 文档写到控制台 JavaScript 语法JavaScript 字面量JavaScript 变量JavaScript 操作符JavaScript 语句JavaScript 字符集JavaScript判断类型 JavaScript数据类…

冉冉升起的星火,再度升级迎来2.0时代!

文章目录 前言权威性评测结果 星火大模型多模态功能插件功能简历生成文档问答PPT生成 代码能力 福利 前言 前几天从技术群里看到大家都在谈论《人工智能大模型体验报告2.0》里边的内容&#xff0c;抱着好奇和学习的态度把报告看了一遍。看完之后瞬间被里边提到的科大讯飞的星火…

基于ACF,AMDF算法的语音编码matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .......................................................................... plotFlag …

系统驱动实现点灯

应用程序&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <string.h>int main(int argc, char const *argv[]) {/* code */…

小游戏扫雷实现教学(详解)

目录 【前言】 一、模块化程序设计&#xff08;多文件编程&#xff09;介绍 1.概述 2.传统编程的方式 3.模块化程序设计的方法 二、扫雷代码设计思路 三、扫雷代码设计 1.创建菜单函数 2.实现9x9扫雷 3.初始化棋盘 4.打印棋盘 5.随机布置雷的位置 6.排查雷的信息 7.回…