【C++ 面试 - 面向对象】每日 3 题(十二)

news2024/11/13 7:55:20

 ✍个人博客:Pandaconda-CSDN博客

📣专栏地址:http://t.csdnimg.cn/fYaBd

📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

 34. 构造函数和析构函数可否抛出异常?

1. C++ 只会析构已经完成的对象,对象只有在其构造函数执行完毕才算是完全构造妥当。在构 造函数中发生异常,控制权转出构造函数之外。

因此,在对象 b 的构造函数中发生异常,对象 b 的析构函数不会被调用。因此会造成内存泄漏。

  • 用 auto_ptr 对象来取代指针类成员,便对构造函数做了强化,免除了抛出异常时发生资源泄漏的危机,不再需要在析构函数中手动释放资源;

  • 如果控制权基于异常的因素离开析构函数,而此时正有另一个异常处于作用状态,C++ 会调用 terminate 函数让程序结束;

2. 如果异常从析构函数抛出,而且没有在当地进行捕捉,那个析构函数便是执行不全的。如果析构函 数执行不全,就是没有完成他应该执行的每一件事情。

在析构函数内部处理异常:

  

上面左边的方法是直接调用 abort 终止程序,右边则是直接吞下异常,只是记录个日志,后面再处理。

但是这两种方法都有个缺点就是用户无法参与操作,因此可以写成下面的方式:

  

用户可以自己实现一个 close 函数来进行关闭,如果关闭的顺利则 closed=true,反之关闭失败则会进行异常捕捉,在析构函数中帮助用户关闭。

总结:

析构函数可以抛出异常,但是这种做法是非常危险的,通常不推荐。因为析构函数具有一种清理资源的特性,如果析构函数本身抛出异常,可能导致以下问题:

  • 资源泄露:当一个对象被析构时,析构函数负责释放该对象持有的资源。如果析构函数抛出异常,这个过程可能会中断,导致资源泄露。

  • 叠加异常:如果析构函数在处理另一个异常时抛出异常,会导致异常叠加。这种情况下,程序将无法处理两个异常,从而可能导致未定义行为或程序崩溃。

为了避免这些问题,通常建议在析构函数中处理异常或者避免执行会抛出异常的函数,可以在析构函数中使用 try-catch 块来捕获和处理潜在的异常,确保资源得到正确释放和清理保证程序的稳定性和健壮性。

35. 构 造函数的几种关键字

default

default 关键字可以显式要求编译器生成合成构造函数,防止在调用时相关构造函数类型没有定义而报错。

#include <iostream>
using namespace std;

class CString
{
public:
    CString() = default; //语句1
    //构造函数
    CString(const char* pstr) : _str(pstr){}
    void* operator new() = delete;//这样不允许使用new关键字
    //析构函数
    ~CString(){}
public:
     string _str;
};

int main()
{
   auto a = new CString(); //语句2
   cout << "Hello World" <<endl;
   return 0;
}
//运行结果
//Hello World

如果没有加语句 1,语句 2 会报错,表示找不到参数为空的构造函数,将其设置为 default 可以解决这个问题。

delete

delete 关键字可以删除构造函数、赋值运算符函数等,这样在使用的时候会得到友善的提示。

#include <iostream>
using namespace std;

class CString
{
public:
    void* operator new() = delete;//这样不允许使用new关键字
    //析构函数
    ~CString(){}
};

int main()
{
   auto a = new CString(); //语句1
   cout << "Hello World" <<endl;
   return 0;
}

在执行语句 1 时,会提示 new 方法已经被删除,如果将 new 设置为私有方法,则会报惨不忍睹的错误,因此使用 delete 关键字可以更加人性化的删除一些默认方法

0

将虚函数定义为纯虚函数(纯虚函数无需定义,= 0 只能出现在类内部虚函数的声明语句处;当然,也可以为纯虚函数提供定义,函数体可以定义在类的外部也可以定义在内部)。

36. 构造函数、拷贝构造函数和赋值操作符的区别

构造函数

对象不存在,没用别的对象初始化,在创建一个新的对象时调用构造函数

拷贝构造函数

对象不存在,但是使用别的已经存在的对象来进行初始化

赋值运算符

对象存在,用别的对象给它赋值,这属于重载 "=" 号运算符的范畴,"=" 号两侧的对象都是已存在的

举个例子:

#include <iostream>
using namespace std;

class A
{
public:
    A()
    {
        cout << "我是构造函数" << endl;
    }
    A(const A& a)
    {
        cout << "我是拷贝构造函数" << endl;
    }
    A& operator = (A& a)
    {
        cout << "我是赋值操作符" << endl;
        return *this;
    }
    ~A() {};
};

int main()
{
    A a1; //调用构造函数
    A a2 = a1; //调用拷贝构造函数
    a2 = a1; //调用赋值操作符
    return 0;
}
//输出结果
//我是构造函数
//我是拷贝构造函数
//我是赋值操作符

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

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

相关文章

区间预测|基于灰狼优化最小二乘支持向量机的多变量回归区间预测Matlab程序GWO-LSSVM-ABKDE

区间预测|基于灰狼优化最小二乘支持向量机的多变量回归区间预测Matlab程序GWO-LSSVM-ABKDE 文章目录 前言区间预测|基于灰狼优化最小二乘支持向量机的多变量回归区间预测Matlab程序GWO-LSSVM-ABKDE 一、GWO-LSSVM-ABKDE模型1. 灰狼优化算法&#xff08;GWO&#xff09;2. 最小二…

vue.js - 看板娘 Live2d

文中的资源文件在这里&#xff1a;我的资源中&#xff0c;打好包了已经&#xff0c;地址&#xff1a;live2d资源 1、在项目的 src/assets 文件夹中&#xff0c;添加 live2d 的资源文件 2、在 src/components 文件中&#xff0c;编写 live2d的index.vue组件 3、在 App.vue 中…

AI在医学领域:在软组织和骨骼肿瘤放射学成像中的应用综述

软组织和骨骼肿瘤&#xff08;Soft-tissue and bone tumours&#xff0c;STBT&#xff09;是人体中较为罕见的肿瘤&#xff0c;包括良性和恶性病变。恶性STBT&#xff0c;约占所有肿瘤的1%。这些肿瘤可以发生在任何年龄和几乎所有解剖部位&#xff0c;起源于包括肌肉、脂肪、血…

富唯智能公司和产品介绍

公司介绍 广州富唯智能科技有限公司是一家专注于人工智能与柔性智造领域的高新技术企业&#xff0c;于2022年联合清华大学深圳国际研究生院成立&#xff0c;拥有多名业内顶尖的人工智能专家、智能制造专家以及硕士和博士组成的高水平研发团队。 公司致力于用前沿的人工智能技…

GenAI大模型应用方法选择深度解析: 模型训练,微调,检索增强RAG和提示工程

重点摘要 每种生成式人工智能学习方法都有其独特的优势和理想应用场景&#xff1a; 模型训练(Model Training)&#xff1a;需要大量的数据和计算资源来从头构建一个人工智能模型。它具有高度的可定制性和可扩展性&#xff0c;但耗时较长。 微调(Fine-Tuning)&#xff1a;专注…

win11成功点亮 WSL 创建的 Linux 子系统 jupyter服务 并配合 conda 环境运行代码【保姆级教程】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 零、前言一、安装 jupyter notebook二、生成jupyter notebook配置文件三、设置J…

力扣top100-链表类题易错点总结-c++实现(更新中)

首先给一个我之前写的双指针在链表类题中的妙用的link&#xff1a;双指针在链表中的妙用 tip1 来自“合并两个有序链表” 题目链接戳这里 这道题注意的就是如果是要返回一个新链表的头结点&#xff0c;一定要新建一个头结点&#xff1a; ListNode* prehead new ListNode…

备考计算机二级Python之Day5

第5章 函数和代码 一、函数的基本使用 函数是一段具有特定功能的、可重用的语句组&#xff0c;通过函数名来表示和调用。 函数的使用包括两部分&#xff1a;函数的定义和函数的使用 1、函数的定义 Python语言通过保留字def定义函数&#xff0c;语法形式如下&#xff1a; …

判别分析2|Bayes判别分析|Fisher判别分析|软件求解

Bayes判别分析 引入先验信息 距离判别只要求知道总体的数字特征&#xff0c;不涉及总体的分布函数 当均值和协方差未知时&#xff0c;就用样本的均值和协方差矩阵做估计值。距离判别方法简单实用&#xff0c;但没有考虑到每个总体出现的机会大小&#xff0c;即先验概率&#…

数据结构(邓俊辉)学习笔记】优先级队列 09——左式堆:合并算法

文章目录 1. LeftHeap模板类2. 算法3. 实现4. 实例 1. LeftHeap模板类 接下来这节&#xff0c;来讨论左式堆的合并算法。再给出具体算法之前&#xff0c;首先要给出左式堆模板类的定义。 比如这就是一种可能的实现方式&#xff0c;可以看到&#xff0c;我们这里再次利用了 C…

srm供应商一体化招采系统解决方案,需求功能清单以及源码实现(JAVA)

1. 供应商管理 2. 采购需求管理 3. 采购寻源管理 4. 采购合同管理 5. 采购订单管理 6. 采购协同管理 7. 外部商城采购管理 8. 报表查询管理 9. 系统管理 10. 集成管理 资料获取&#xff1a;本文末个人名片。

在Activity中使用Menu

在Activity中使用Menu 手机毕竟和电脑不同&#xff0c;它的屏幕空间非常有限&#xff0c;因此充分地利用屏幕空间在手机界面设计中就显得非常重要了。如果你的活动中有大量的菜单需要显示&#xff0c;这个时候界面设计就会比较尴尬&#xff0c;因为仅这些菜单就可能占用屏幕将…

构建高效的串行任务执行器:SerialExecutor深度解析

本文主要介绍怎么去实现一个支持串行执行任务的SerialExecutor执行器 摘要 在复杂的异步编程中&#xff0c;有时我们需要确保任务以串行的方式执行&#xff0c;以维护任务间的依赖关系或顺序。SerialExecutor 是一个自定义的执行器&#xff0c;它封装了 Java 的 Executor 接口…

Linux磁盘分区,增加磁盘应用实例,磁盘情况查询

目录 linux磁盘分区机制 原理介绍 示意图 硬盘说明 查看所有设备挂载情况 挂载的经典案例 给虚拟机添加硬盘 分区 删除挂载 永久挂载 磁盘情况查询 查询系统整体磁盘使用情况 查询指定目录的磁盘占用情况 linux磁盘分区机制 原理介绍 载入可以将一个分区和一个目录…

【精选】基于微信小程序的地铁站点查询系统(全网独一无二,阿龙原创设计)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

C#入门篇3

目录 一、练习 二、显示类型转换&#xff08;强制类型转换&#xff09; 三、Convert的转换工厂转换 四、算数运算符号之&#xff08; /--&#xff09; 五、关系运算符&#xff08;比较运算&#xff09; 六、逻辑运算符 七、复合运算符 一、练习 计算半径为5的圆的面积和周…

Windows平台SDKMAN工具使用

为方便jvm生态的软件版本管理&#xff0c;可以使用sdkman工具来安装和管理诸如java、gradle等软件的当前使用版本。尤其是大多数程序员都是在windows平台开发&#xff0c;团队开发通常都需要统一的jvm相关软件的版本。这里给大家演示下windows平台如何安装和使用sdkman来实现这…

普元EOS-自定义SDO代码生成模板

1 前言 普元EOS的数据实体生成SDO接口和实现类的代码&#xff0c;可以通过自定义代码生成模板&#xff0c;实现代码自定义。 2 模板存放位置 模板存放位置如下&#xff1a;安装目录/dropins/eostools/com.primeton.studio.entity.ui-x.x.x.x.jar里面&#xff0c;SDO模版都在/…

揭秘CAAC、AOPA、ALPA、ASFC和UTC无人机执照的差别及实用价值

CAAC、AOPA、ALPA、ASFC和UTC无人机执照各有其独特的差别及实用价值&#xff0c;以下是针对这些执照的详细解析&#xff1a; 一、CAAC无人机执照 颁发机构&#xff1a;中国民用航空局&#xff08;CAAC&#xff09; 差别&#xff1a; - 权威性&#xff1a;CAAC无人机执照是目…

Go机器学习框架之火重燃,Google前研究员开源期望媲美Jax的GoMLX

Go作为一门兼具高性能与简洁性的编程语言&#xff0c;近年来在各种领域得到广泛应用。然而&#xff0c;在机器学习领域&#xff0c;Go相比Python、C、Julia等语言&#xff0c;生态仍然较为薄弱。目前的Go机器学习框架无论在功能全面性上&#xff0c;还是在社区生态支持上都难以…