剑指offer试题整理1

news2025/7/18 8:18:09

1、定义一个空的类型,里面没有任何成员变量和成员函数。对该类型求sizeof,得到的结果是什么?

答案:1.

为什么不是0?

空类型的示例中不包含任何信息,本来求siezof应该是0,但是当我们声明改类型的实列是时候,它必须再内存中占有一定的空间,否则无法使用这些实例。
对于至少占用多少内存,这由编译器决定。
在Visual Studio中,每个空类型的实例都占用一字节的空间。
在这里插入图片描述

如果在该类型中添加一个构造函数和析构函数,再对该类型求sizeof,得到的结果优势多少?

还是1。
调用构造函数和析构函数只需要知道函数的地址即可,而这些函数的地址只与类型相关,而与类型的示例无关,编译器也不会因为这两个函数而再示例内添加任何额外的信息。
在这里插入图片描述

那添加一个析构函数呢?如果把析构函数标记为虚函数呢?

C++编译器一旦发现一个类型中由虚函数,就会为该类型生成虚函数表,并在该类型的每一个示例中添加一个指向虚函数表的指针。
在32位的机器上,一个指针占4字节,因此求sizeof得到4;如果是在64位的机器,则一个字节占8字节的空间,因此求sizeof得到8。

在这里插入图片描述

2、

给出以下代码,分析编译器运行的结果:
A、编译错误;
B、编译成功,运行时程序崩溃;
C、编译运行正常,输出10;

class A
{
private:
	int value;
public:
	A(int n){value = n;}
	A(A other){value = other.value;}

	void Print(){std::cout << value << std::endl;}

};

int _tmain(int argc,_TCHAR *argv[])
{
	A a = 10;
	A b = a;
	b.Print();

	return 0;
}

在上述代码中,复制构造函数A(A other)传入的参数是A的一个实例。由于是传值参数,我们把形参复制到实参会调用复制构造函数。因此,如果允许复制构造函数传值,就会在复制构造函数内调用复制构造函数,就会形成永无休止的递归调用从而导致栈溢出。因此,C++的标准不允许复制构造函数传值参数,在 Visual Studio和 GCC中,都将编译出错。要解决这个问题,我们可以把构造函数修改为A(const A& other),也就是把传值参数改成常量引用。

在这里插入图片描述
在这里插入图片描述

3、赋值运算符函数

题目:如下为类型CMyString 的声明,请为该类型添加赋值运算符函数。

class CMyString
{
public:
	CMyString(char *pData = nullptr);	
	CMyString(const CMyString& str);
	~CMyString(void);
	
private:
	char* m_pData;
};

经典解法:

CMyString& CMyString::operator =(const CMyString &str)
{
	//判断自赋值
	if(this == &str)
		return *this;

	//先释放左值
	delete[]m_pData;
	m_pData = nullptr;

	//开辟右值空间大小
	m_pData = new char[strlen(str.m_pData) + 1];

	//拷贝赋值
	strcpy_s(m_pData,strlen(str.m_pData) + 1,str.m_pData);

	//返回引用
	return *this;
}

考虑异常安全性的解法

在经典解法中,我们在分配内存之前先调用了delete 释放了实例 m_pData 的内存。但如果此时的内存不足,导致new char 抛出异常,则 m_pData 将是一个空指针,这样很容易导致程序崩溃。
即,一旦在赋值运算符函数内部抛出一个异常,CMyString的实例不再保持有效的状态,这就违背了安全性原则。

要想在赋值运算符函数中实现异常安全性,有两种方法:
一种简单的办法是我们先用new 分配新内容,再用 delete释放已有的内容。这样只在分配内容成功之后再释放原来的内容,也就是当分配内存失败时我们能确保 CMyString的实例不会被修改。
我们还有一种更好的办法,即先创建一个临时实例,再交换临时实例和原来的实例。下面是这种思路的参考代码:

	CMyString& CMyString::operator =(const CMyString &str)
	{
		if(this != &str)
		{
			//创建一个临时实例strTemp,在当前{}结束后,会自动调用自己的析构函数释放相关内存
			CMyString strTemp(str);

			//把strTemp.m_pData 和实例自身的m_pData进行交换  当临时变量strTemp析构时,因为进行了交换,所以会释放原来p_Data的内存
			char* pTemp = strTemp.m_pData; 
			strTemp.m_pData = m_pData;
			m_pData = pTemp;
		}

		return *this;
	}

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

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

相关文章

Zookeeper的数据模型和节点类型

数据模型&#xff1a; 树形结构 zk维护的数据主要有&#xff1a;客户端的会话&#xff08;session&#xff09;状态及数据节点&#xff08;dataNode&#xff09;信息。 zk在内存中构造了个DataTree的数据结构&#xff0c;维护着path到dataNode的映射以及dataNode间的树状层级关…

asp.net+sqlserver团购网站c#

数据需求分析 该网站的主要功能主要体现在对各种信息的添加、修改、删除和查询的操作上&#xff0c;包括会员信息、公司管理信息、订单信息、产品信息、团购管理信息等&#xff0c;各部分的信息之间又有着内在联系&#xff0c;因此总结出如下需求&#xff1a; &#xff08;1&am…

使去中心化媒体网络相关联的NFT元数据标准

1. 概述 (社交)媒体网络的力量日益强大。我们需要分散这种力量&#xff0c;使网络更加透明。 由于网络效应&#xff0c;新媒体网络和能够与现有网络竞争的去中心化替代方案很难吸引广大公众。 我们建议&#xff0c;与其创建新的协议&#xff0c;将每个平台的内容隔离起来&…

录屏怎么录,这2个方法不容错过!

​我们都知道在电脑使用频率越来越高的现在&#xff0c;无论是生活中还是工作中&#xff0c;有时可能会因为一些需要&#xff0c;使用到录屏的功能。最近&#xff0c;有不少的小伙伴前来询问小编&#xff0c;录屏怎么录&#xff1f;其实答案很简单&#xff0c;接下来小编分享的…

手机号码认证什么价格?手机号码认证怎样申请?

手机号码认证基于通话场景(呼入&#xff0c;呼出)的指定号码&#xff0c;来电展示企业号码专门名称&#xff0c;可提高电话号码辨识度&#xff0c;防止错误标记&#xff0c;提升品牌曝光度、接听率&#xff0c;低成本提升目标顾客接听率。 手机号码认证如何收费呢&#xff1f;…

【附源码】Python计算机毕业设计图书销售网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

数据结构和算法 IV

数据结构和算法 IV 面试题 冒泡排序 排序算法 原理机制: 相邻元素两两比较,大的/小的往后排,一轮比较结束,最大值出现在最大下标处.会比较多轮 代码实现 public static void main(String[] args) {int[] ary {23,12,7,0,67,9,11};for (int i0;i<ary.length-1;i){ //i…

MySQL高频面试题

1. drop&#xff0c;delete和truncate删除数据的区别&#xff1f; delete 语句执行删除是每次从表中删除一行&#xff0c;并且同时将改行的删除操作作为事务记录在日志中保存以便进行回滚。 truncate 则是一次从表中删除所有的数据并不把单独的删除操作记录计入日志&#xff0c…

详述分布式事务Seata TCC空回滚/幂等/悬挂问题、解决方案(seata1.5.1如何解决?)

文章目录一、前言二、问题介绍、seata1.5.1版本之前的解决方案1、空回滚出现原因解决措施事务控制记录表try()、cancel()中获取xid、branch_id2、幂等出现原因解决措施事务控制记录表3、悬挂出现原因解决措施4、总述最终的事务控制记录表三、seata1.5.1版本起官方提供的解决措施…

[附源码]java毕业设计基于Java烟支信息管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

前端框架 网络请求 Fetch Axios

目录 一、Fetch请求的使用 1、 Fetch官网 2、基本案例 二、跨域请求解决 三、Axios的使用 1、Axios官网 2、基本使用 推荐使用Axios更方便&#xff01; 一、Fetch请求的使用 1、 Fetch官网 使用 Fetch - Web API 接口参考 | MDN 2、基本案例 二、跨域请求解决 &…

2023第二届中国能源管理碳中和国际峰会

峰会背景 应对气候变化已经成为21世纪人类社会面临的紧迫挑战&#xff0c;推进绿色发展成为全球共识。中国积极参与和引导应对气候变化国际合作&#xff0c;向世界作出“力争2030年前实现碳达峰、2060年前实现碳中和”的承诺&#xff0c;逐步完善碳达峰碳中和“1N”政策体系&a…

史上最全安装Maven教程一看就会吊炸天的教程

史上最全安装Maven教程 简单了解一下什么是Maven 1.Maven翻译为“专家“&#xff0c; ”内行”的意思&#xff0c;是著名Apache公司下基于Java开发的开源项目。 2.Maven项目对象模型&#xff08;POM&#xff09;是一个项目管理工具软件&#xff0c;可以通过简短的中央信息描述…

LeetCode第 319 场周赛题解

目录2469. 温度转换2470. 最小公倍数为 K 的子数组数目2471. 逐层排序二叉树所需的最少操作数目2472. 不重叠回文子字符串的最大数目2469. 温度转换 模拟 class Solution { public:vector<double> convertTemperature(double celsius) {return {celsius273.15,celsius*1…

前端面试中小型公司都考些什么

什么是物理像素&#xff0c;逻辑像素和像素密度&#xff0c;为什么在移动端开发时需要用到3x, 2x这种图片&#xff1f; 以 iPhone XS 为例&#xff0c;当写 CSS 代码时&#xff0c;针对于单位 px&#xff0c;其宽度为 414px & 896px&#xff0c;也就是说当赋予一个 DIV元素…

Ubuntu20.04 中已经安装 Pytorch 但 Import 报错 - 解决记录

01 问题描述 笔者使用的是 Ubuntu 20.04.3 LTS&#xff0c;在使用 PyTorch 训练模型的时候&#xff0c;torch 模块引用失败&#xff0c;报错信息是 OSError: /home/wang/.local/lib/python3.8/site-packages/torch/lib/../../nvidia/cublas/lib/libcublas.so.11: undefined s…

C++对象和类概述

11 对象和类 11.1 过程式和面向对象编程 面向过程编程&#xff1a;先考虑函数&#xff0c;然后再细化到数据 面向对象编程&#xff1a;对象&#xff08;数据函数&#xff09; 11.2 抽象和类 在计算中&#xff0c;抽象是根据与用户的接口来表示信息的关键步骤。 11.2.1 什…

QT默认自带mscv2017 2019 ,配置vs2022

试验QT版本&#xff1a;5.14.2 所需文件&#xff1a; QT安装程序--qt-opensource-windows-x86-5.14.2.exe具体地址是&#xff1a;Index of /archive/qthttps://download.qt.io/archive/qt/Microsoft 生成工具 2022 Visual Studio 2022 IDE - 适用于软件开发人员的编程工具win…

Cholesterol胆固醇参数说明及相关研究

Cholesterol胆固醇是哺乳动物细胞中产生的一种主要甾醇&#xff0c;是细胞存活和增殖所必需的。它是哺乳动物细胞膜的一种成分&#xff0c;与膜磷脂、鞘脂和蛋白质相互作用&#xff0c;影响它们的行为。它也是各种基于脂质的药物递送&#xff08;LBDD&#xff09;系统的组成部分…

[oeasy]python0015_十六进制_hexadecimal_字节形态_hex函数

十六进制(hexadecimal) 回忆上次内容 上次数制可以转化 bin(n)可以把数字转化为 ​​2进制​ binary接收一个整数(int)得到一个二进制数形式的字符串数字在计算机中是用二进制存储的 但是展示给我们的时候用的是十进制也就是0-9这10个字符的形式都说字节是计算机存储的最小单…