Day6: 5道C++ 面向对象高频题整理

1.C++的空类有哪些成员函数

在C++中,一个空类(即没有定义任何数据成员和成员函数的类)默认会有以下几个成员函数被编译器自动生成(也就是说,即使你在代码中没有显式地定义这些函数,编译器在编译的时候也会为你的类自动添加这些函数):

  • 默认构造函数:这是一个没有任何参数的构造函数。如果你没有为你的类定义任何构造函数,编译器就会为你的类生成一个默认构造函数。
  • 析构函数:这是一个用来清理对象的函数。当你的对象不再被使用时(比如它离开了它的作用域,或者你用delete来删除了一个动态分配的对象),这个函数会被调用。

  • 拷贝构造函数:这个函数用来创建一个新对象,这个新对象的状态和另一个已经存在的对象(也就是这个函数的参数)相同。

  • 拷贝赋值运算符:这个函数用来把一个已经存在的对象的状态复制到另一个已经存在的对象。

  • 移动构造函数(C++11及更高版本):这个函数用来创建一个新对象,这个新对象会接管另一个已经存在的对象的资源。这个”另一个对象”通常是一个即将被销毁的临时对象。

  • 移动赋值运算符(C++11及更高版本):这个函数用来把一个已经存在的对象的资源转移到另一个已经存在的对象,然后销毁原来的对象。

要注意的是,虽然编译器会自动生成这些函数,但如果你为你的类显式地定义了任何一个构造函数,编译器就不会再为你的类生成默认构造函数。同样,如果你为你的类显式地定义了拷贝构造函数,拷贝赋值运算符,或者析构函数,编译器就不会为你的类生成移动构造函数和移动赋值运算符。

2. 模板函数和模板类的特例化

在C++中,模板是一种功能强大而灵活的工具,它允许我们编写通用的代码,这些代码可以处理各种不同的数据类型。然而,在某些情况下,我们可能希望对某些特定的数据类型使用特定的代码实现,而不是使用通用的模板。这就是特例化的作用。

  • 函数模板特例化:对于函数模板,我们可以提供特定类型的特例化版本。当这个特定类型的函数被调用时,编译器会优先选择这个特例化版本的函数,而不是通用的模板函数。
// 通用模板函数
template <typename T>
void print(const T& value) {
    std::cout << value << "\n";
}

// 特例化版本,用于std::string类型
template <>
void print<std::string>(const std::string& value) {
    std::cout << "String value: " << value << "\n";
}

在这个例子中,如果我们调用print(42),编译器会选择通用模板函数;如果我们调用print(std::string("Hello")),编译器会选择特例化版本的函数。

  • 类模板特例化:对于类模板,我们也可以提供特定类型的特例化版本。当我们用这个特定类型来实例化这个模板类时,编译器会使用这个特例化版本的类,而不是通用的模板类。
// 通用模板类
template <typename T>
class MyArray {
    // ...一些通用的实现...
};

// 特例化版本,用于bool类型
template <>
class MyArray<bool> {
    // ...一些针对bool类型的特殊实现...
};

在这个例子中,如果我们写MyArray<int> myIntArray;,编译器会使用通用模板类;如果我们写MyArray<bool> myBoolArray;,编译器会使用特例化版本的类。

3.为什么析构函数一般写成虚函数

在C++中,当我们有一个指向基类的指针或引用,而它实际上指向的是一个派生类的对象时,如果我们通过这个指针或引用去删除这个对象,那么就会调用相应的析构函数来清理这个对象。

如果这个析构函数不是虚函数,那么就会调用基类的析构函数,而派生类的析构函数则不会被调用。这就可能导致资源泄漏,因为派生类的析构函数通常负责清理派生类特有的资源。

但是如果我们把基类的析构函数声明为虚函数,那么在删除对象时就会调用正确的析构函数。也就是说,如果我们通过一个指向基类的指针删除一个派生类的对象,那么就会先调用派生类的析构函数,然后再调用基类的析构函数。这样就能确保所有的资源都被正确地清理。

class Base {
public:
    virtual ~Base() {
        // 清理基类的资源
    }
};

class Derived : public Base {
public:
    ~Derived() {
        // 清理派生类的资源
    }
};

Base* obj = new Derived();
delete obj;  // 这会先调用Derived的析构函数,然后再调用Base的析构函数

因此,如果你的类是作为基类使用的(也就是说,你的类有可能被其他类继承),那么你应该让你的类的析构函数成为虚函数,以防止资源泄漏。

深入学习:C++中虚析构函数的作用及其原理分析-CSDN博客

4.C++构造函数为什么不能是虚函数

C++构造函数为什么不能是虚函数-CSDN博客

5.一级指针、二级指针做函数参数的深入剖析

一级指针、二级指针做函数参数的深入剖析_函数里 一级指针 参数 修改-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes TDengine 系列|安装 TDengine 的 Grafana 插件|Grafana监控TDengine数据

为了让Grafana 能够监控到TDengine 数据&#xff0c;快速集成搭建数据监测报警系统&#xff0c;所以直接安装TDengine 插件。 目录 一、安装 TDengine 的 Grafana 插件1、下载TDengine grafana插件2、解压到指定目录3、配置未签名插件 二、配置数据源&#xff0c;简单查询TDen…

想在游泳健身的同时畅听音乐,随时哈氪漫游这款IP68防水的骨传导耳机

平时健身的过程中&#xff0c;音乐是许多健身爱好者的忠实伴侣。无论是在室内的健身房&#xff0c;还是户外的自然风光中&#xff0c;一副优质的耳机可以极大地提升我们的锻炼体验。现在市面上专为运动设计的耳机选择非常多&#xff0c;我喜欢用骨传导耳机&#xff0c;目前在用…

Linux--忘记root密码解决办法

Linux忘记密码解决的方法有两种&#xff1a; 方法一&#xff1a; 第一步&#xff1a;打开虚拟机时&#xff0c;疯狂按方向键&#xff0c;让该虚拟机不进入系统停留在开机界面&#xff0c;按方向键使光标停留在第一行&#xff0c;按字母E编辑它&#xff0c;如 按E后&#xff0…

数据结构 - 链表详解(二)—— 带头双向循环链表

链表的介绍 链表的结构一共有八种&#xff1a;带头单向循环链表、带头单向非循环链表、带头双向循环链表、带头双向非循环链表、无头单向循环链表、无头单向非循环链表、无头双向循环链表、无头双向非循环链表。 今天我们来详解带头双向循环链表 带头双向循环链表是一种数据结…

2024深圳杯C题的8页思路分析+所有代码可执行+参考文献+持续更新参考论文(已经更新了代码与图像)

比赛题目的完整版思路可执行代码数据参考论文都会在第一时间更新上传的&#xff0c;大家可以参考我往期的资料&#xff0c;所有的资料数据以及到最后更新的参考论文都是一次付费后续免费的。注意&#xff1a;&#xff08;建议先下单占坑&#xff0c;因为随着后续我们更新资料数…

用ESP32的ADC引脚,结合分压电路测量电压

该代码基于ESP32&#xff08;Arduino库&#xff09;实现ADC&#xff08;模拟数字转换器&#xff09;数据采集。它配置ADC参数、获取校准特性&#xff0c;循环采样并计算平均值&#xff0c;将ADC读数转换为电压&#xff0c;考虑分压电阻影响&#xff0c;计算实际电压值&#xff…

【论文复现】时间协同制导算法

一、背景部分 如需了解请看李康博士关于该论文背景简介&#xff1a;基于一致性算法的分布式时间协同制导律 - 知乎 (zhihu.com) 论文链接&#xff1a;Distributed Cooperative Guidance for Multivehicle Simultaneous Arrival Without Numerical Singularities (westlake.ed…

Pandas Series显式切片和隐式切片大揭秘

Pandas Series在Python的数据处理中扮演着非常重要的角色。它是一维数组&#xff0c;可以容纳任何数据类型&#xff08;整数、字符串、浮点数、Python对象等&#xff09;&#xff0c;并且提供了大量的方法来进行数据操作和分析。Pandas Series的切片操作是其核心功能之一&#…

colab直接下载kaggle数据集

1.获取kaggle API Token account-settings-API&#xff0c;这时候会下载一个kaggle.json&#xff0c;然后将里面的内容{username:.......}复制一份 &#xff08;个人怕之后找不到另外放了一份到Google云端硬盘中&#xff09; 2.在colab中绑定kaggle !pip install -U -q kagg…

技术实践|大模型内容安全蓝军的道与术

1、引子 大语言模型&#xff08;LLM&#xff09;在2023年大放异彩&#xff0c;在许多领域展现出强大的能力&#xff0c;包括角色扮演&#xff0c;文本创作&#xff0c;逻辑推理等。然而&#xff0c;随着其应用范围的扩大&#xff0c;生成内容的安全问题也日益凸显。这包括但不…

el-upload组件如何上传blob格式的url地址视频

el-upload组件如何上传blob格式的url地址视频 一、存在问题二、直接上代码 需求&#xff1a;想把视频地址url:“blob:http://localhost:8083/65bd3c0f-52ec-4844-b85e-06fdb5095b7b”&#xff0c;通过el-upload组件上传 el-upload是Element UI中用于文件上传的组件&#xff0c;…

如何开启kali的ssh远程连接

1.打开配置文件 vim /etc/ssh/sshd_config 将第13行和32改为如下&#xff0c;保存退出 重启服务 sudo systemctl restart ssh.service 使用远程工具&#xff08;如xshell&#xff09;即可连接 如果无法连接&#xff0c;需要先生成两个密钥&#xff1a;ssh-keygen -t dsa -f…

【14-Ⅱ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

每周一算法:最短路计数

题目描述 给出一个 N N N个顶点 M M M 条边的无向无权图&#xff0c;顶点编号为 1 1 1 到 N N N。 问从顶点 1 1 1 开始&#xff0c;到其他每个点的最短路有几条。 输入格式 第一行包含 2 2 2 个正整数 N , M N,M N,M&#xff0c;为图的顶点数与边数。 接下来 M M …

Linux基础命令[25]-groupadd

文章目录 1. groupadd 命令说明2. groupadd 命令语法3. groupadd 命令示例3.1 不加参数3.2 -f&#xff08;强制创建&#xff09;3.3 -g&#xff08;指定组ID&#xff09;3.4 -r&#xff08;系统用户组&#xff09; 4. 总结 1. groupadd 命令说明 groupadd&#xff1a;用于创建…

C语言入门课程学习记录4

C语言入门课程学习记录4 第18课 - signed 与 unsigned第19课 - 再论数据类型第20课 - 经典问题剖析第21课 - 程序中的辅助语句&#xff08;上&#xff09;第22课 - 程序中的辅助语句&#xff08;下&#xff09; 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程&#xff0c;…

【C++】:拷贝构造函数和赋值运算符重载

目录 一&#xff0c;拷贝构造函数1. 什么是拷贝构造函数2. 拷贝构造函数的特性3. 实践总结 二&#xff0c;赋值运算符重载2.1 运算符重载2.2 赋值运算符重载 一&#xff0c;拷贝构造函数 1. 什么是拷贝构造函数 拷贝构造函数是特殊的构造函数。是用一个已经存在的对象&#x…

JVM虚拟机监控及性能调优实战

目录 jvisualvm介绍 1. jvisualvm是JDK自带的可以远程监控内存&#xff0c;跟踪垃圾回收&#xff0c;执行时内存&#xff0c;CPU/线程分析&#xff0c;生成堆快照等的工具。 2. jvisualvm是从JDK1.6开始被继承到JDK中的。jvisualvm使用 jvisualvm监控远程服务器 开启远程监控…

软考高级 | 系统架构设计师笔记(一)

一. 系统规划 1.1 项目的提出与选择 该步骤生成” 产品/项目建议书”. 1.2 可行性研究与效益分析 包括经济可行性/技术可行性/法律可行性/执行可行性/方案选择 5 个部分. 该步骤生 成”可行性研究报告”. 1.3 方案的制订和改进 包括确定软件架构/确定关键性要素?/确定计算…

java Web-Spring AOP

AOP的概念 AOP:面向切面编程&#xff0c;面向方法编程。简单理解就是对特定方法的扩充的思想 例如我们要在特定方法进行方法的执行时间判断&#xff0c;我们假如去使用在每个方法去进行业务逻辑扩充&#xff0c;这样就太繁琐了&#xff0c;而使用AOP就可以简化操作。Spring A…
最新文章