当前位置: 首页 > news >正文

突破编程_C++_面试(基础知识(10))

面试题29:什么是嵌套类,它有什么作用

嵌套类指的是在一个类的内部定义的另一个类。嵌套类可以作为外部类的一个成员,但它与其声明类型紧密关联,不应被用作通用类型。嵌套类可以访问外部类的所有成员,包括私有成员,这是嵌套类的一个重要特性。
嵌套类的作用主要有以下几点:
(1)封装和隐藏实现细节:嵌套类可以用于隐藏实现细节,使得外部类看起来更加简洁和易于使用。
(2)提供服务:嵌套类通常是为外部类提供服务的,它可以访问外部类的所有成员,因此可以方便地实现与外部类相关的功能。
(3)代码组织:嵌套类可以用于组织代码,将相关的类放在一起,提高代码的可读性和可维护性。
需要注意的是,嵌套类不应被公开可见,除非必要。在设计良好的库中,开发人员几乎不需要使用嵌套类来实例化对象或声明变量。在大多数情况下,嵌套类应该被视为实现细节的一部分,而不是公开的 API 。
嵌套类访问权限遵循一般的类成员访问权限规则,嵌套类可以是 public 、 protected 或 private ,这取决于它们在外部类中的声明方式。这些访问修饰符决定了嵌套类在外部类的外部可见性和可访问性。
(1) public 嵌套类
如果嵌套类被声明为 public ,则它在外部类的外部是可见的,并且可以被任何能够访问外部类的代码所访问和使用。
(2) protected 嵌套类
如果嵌套类被声明为 protected ,则它在外部类的外部是不可见的,但可以被外部类的派生类访问。注意:一般很少将嵌套类定义成 protected 。
(3)Private嵌套类
如果嵌套类被声明为 private ,则它在外部类的外部是不可见的,并且只能被外部类的成员函数访问。
嵌套类在实现某些设计模式(如工厂模式、组合模式等)时也非常有用,典型的比如使用嵌套类实现工厂模式:

#include <iostream>  
#include <string>  using namespace std;// 外部类,作为工厂类的容器 
class AnimalFactory
{
public:// 嵌套类,定义不同的动物 class Animal{public:virtual void eat() {}};// 嵌套类,实现具体的动物类(猫)class Cat : public Animal{public:void eat() {printf("cat eat\n");}};// 嵌套类,实现具体的动物类(狗)class Dog : public Animal{public:void eat(){printf("dog eat\n");}};// 工厂方法,根据传入的字符串创建相应的动物  static std::shared_ptr<Animal> createAnimal(const std::string& animalType) {if ("Cat" == animalType) {return std::shared_ptr<Animal>(new Cat);}else if ("Dog" == animalType){return std::shared_ptr<Animal>(new Dog);}return nullptr; // 如果类型不匹配,返回空指针  }
};int main() 
{std::shared_ptr<AnimalFactory::Animal> cat = AnimalFactory::createAnimal("Cat");cat->eat();std::shared_ptr<AnimalFactory::Animal> dog = AnimalFactory::createAnimal("Dog");dog->eat();return 0;
}

上面代码的输出为:

cat eat
dog eat

在这个例子中,AnimalFactory 类包含了 3 嵌套类 Animal 、Cat 和 Dog,Cat 类和 Dog 类分别实现了 Animal 基类的 eat 方法。AnimalFactory 类还提供了一个静态工厂方法 createAnimal,该方法根据传入的字符串参数创建并返回相应类型的动物对象。main 函数中展示了如何使用工厂方法来创建和使用不同的对象。
使用嵌套类实现工厂模式的好处是,所有与形状相关的类都集中在 AnimalFactory 类中,这有助于保持代码的整洁和组织性。此外,通过将工厂方法放在 AnimalFactory 类中,可以确保只有这个类能够创建形状对象,这有助于控制对象的创建过程。

面试题30:什么是类静态成员,它有什么作用

类静态成员是类中声明为 static 的成员,包括静态成员变量和静态成员函数。静态数据成员是与类关联的全局变量,而不是与类的实例关联。静态成员函数可以在没有类实例的情况下调用,且只能访问静态成员变量或其他静态成员函数。
如下为类静态成员的样例:

#include <iostream> class MyClass
{
public:MyClass() {}~MyClass() {}public:static void printStaticVal(){printf("static value = %d\n", m_staticVal);}static void setStaticVal(int val){m_staticVal = val;}private:static int m_staticVal;
};int MyClass::m_staticVal = 0;int main() 
{MyClass::setStaticVal(1);MyClass::printStaticVal();return 0;
}

上面代码的输出为:

static value = 1

上面代码中, MyClass 有一个静态成员变量 m_staticVal 和两个静态成员函数 printStaticVal 和 setStaticVal 。这些静态成员可以被类的任何对象访问,也可以直接通过类名访问。当通过 MyClass::setStaticVal 设置 m_staticVal 的值时,所有 m_staticVal 的对象都会看到相同的值,因为静态成员是共享的。
类静态成员有如下 5 个特点:
(1)存储:静态数据成员在内存中只有一份拷贝,无论创建多少个类的对象。
(2)初始化:静态数据成员在类外部进行初始化,且只初始化一次。
(3)访问:静态成员函数只能访问静态数据成员或其他静态成员函数,不能访问非静态成员。
(4)生命周期:静态成员的生命周期与程序的生命周期相同。
(5)共享:所有类的实例共享同一个静态数据成员。
类静态成员的主要作用是提供类级别的信息或功能,这些信息或功能与类的具体实例无关。静态数据成员可以用于存储类级别的常量、统计信息或共享资源。静态成员函数可以用于执行不依赖于类实例的操作,如修改静态数据成员或执行与类相关的全局操作。此外,静态成员函数还可以用于访问静态数据成员,并在没有类实例的情况下被调用。

面试题31:什么是浅拷贝和深拷贝,其各自适用的场景是什么

浅拷贝( Shallow Copy ):只复制对象的值或对象的引用(指针),但不复制对象引用的实际对象。如果对象内部包含动态分配的内存或其他资源,则这些资源在浅拷贝后会被多个对象共享,可能导致资源释放时的错误(如双重删除)。浅拷贝适用于对象间共享资源且不需要修改这些资源的场景。浅拷贝可以提高性能,因为不需要复制大量数据。但是,如果共享的资源被意外修改或释放,可能会导致问题。
深拷贝( Deep Copy ):复制对象的值以及对象引用的实际对象。对于包含动态分配内存的对象,深拷贝会创建这些内存区域的新副本,确保每个对象都有自己独立的资源副本。深拷贝适用于需要对象拥有独立资源副本的场景。深拷贝可以确保每个对象都可以独立修改资源而不会影响其他对象。但是,深拷贝可能占用更多的内存,并且在复制大量数据时可能会影响性能。

面试题32:C++中默认的拷贝构造函数执行的是深拷贝还是浅拷贝

C++ 中默认的拷贝构造函数执行的是浅拷贝。它只逐成员复制对象的内容,如果成员是指针或引用,那么它只是复制这些指针或引用的值,而不是它们所指向的实际对象。

面试题33:如何在C++中实现深拷贝

要实现深拷贝,需要自定义拷贝构造函数与重载赋值运算符,并在其中为动态分配的内存或其他资源创建新的副本。如下为样例代码:

#include <iostream>  class MyClass 
{
public:MyClass(int value) {m_val = new int(value);}~MyClass() {delete m_val;}// 拷贝构造函数(深拷贝)  MyClass(const MyClass& other){m_val = new int(*(other.m_val));}// 赋值运算符(深拷贝)  MyClass& operator=(const MyClass& other){if (this != &other) {delete m_val; // 先删除当前对象的数据  m_val = new int(*(other.m_val)); // 然后复制其他对象的数据  }return *this;}public:void setVal(int val){*m_val = val;}void printVal(){printf("val = %d\n",*m_val);}private:int* m_val;
};int main() {MyClass obj1(0);MyClass obj2 = obj1;obj2.setVal(1);	// 通过 obj2 对象修改值,obj1 不会被改变printf("obj1: ");obj1.printVal();printf("obj2: ");obj2.printVal();return 0;
}

上面代码的输出为:

obj1: val = 0
obj2: val = 1

在上面代码中,拷贝构造函数和赋值运算符都创建了一个新的整数,并复制了 obj1 对象中 m_val 指针指向的值。这样,每个对象都有自己独立的内存块,修改一个对象不会影响另一个对象。
深拷贝通常比浅拷贝更耗时和资源密集,因为它涉及到分配额外的内存和复制数据。然而,深拷贝提供了更好的数据完整性和安全性,特别是在涉及到多个对象共享同一份数据时。

相关文章:

突破编程_C++_面试(基础知识(10))

面试题29&#xff1a;什么是嵌套类&#xff0c;它有什么作用 嵌套类指的是在一个类的内部定义的另一个类。嵌套类可以作为外部类的一个成员&#xff0c;但它与其声明类型紧密关联&#xff0c;不应被用作通用类型。嵌套类可以访问外部类的所有成员&#xff0c;包括私有成员&…...

初步探索Pyglet库:打造轻量级多媒体与游戏开发利器

目录 pyglet库 功能特点 安装和导入 安装 导入 基本代码框架 导入模块 创建窗口 创建控件 定义事件 运行应用 程序界面 运行结果 完整代码 标签控件 常用事件 窗口事件 鼠标事件 键盘事件 文本事件 其它场景 网页标签 音乐播放 图片显示 祝大家新…...

【npm】安装全局包,使用时提示:不是内部或外部命令,也不是可运行的程序或批处理文件

问题 如图&#xff0c;明明安装Vue是全局包&#xff0c;但是使用时却提示&#xff1a; 解决办法 使用以下命令任意一种命令查看全局包的配置路径 npm root -g 然后将此路径&#xff08;不包括node_modules&#xff09;添加到环境变量中去&#xff0c;这里注意&#xff0c;原…...

Go 语言 for 的用法

For statements 本文简单翻译了 Go 语言中 for 的三种用法&#xff0c;可快速学习 Go 语言 for 的使用方法&#xff0c;希望本文能为你解开一些关于 for 的疑惑。详细内容可见文档 For statements。 For statements with single condition 在最简单的形式中&#xff0c;只要…...

熵权法Python代码实现

文章目录 前言代码数据熵权法代码结果 前言 熵权法做实证的好像很爱用&#xff0c;matlab的已经实现过了&#xff0c;但是matlab太大了早就删了&#xff0c;所以搞一搞python实现的&#xff0c;操作空间还比较大 代码 数据 import pandas as pd data [[100,90,100,84,90,1…...

浏览器提示ERR_SSL_KEY_USAGE_INCOMPATIBLE解决

ERR_SSL_KEY_USAGE_INCOMPATIBLE报错原因 ERR_SSL_KEY_USAGE_INCOMPATIBLE 错误通常发生在使用 SSL/TLS 连接时,指的是客户端和服务器之间进行安全通信尝试失败,原因是证书中的密钥用途(Key Usage)或扩展密钥用途(Extended Key Usage, EKU)与正在尝试的操作不兼容。这意味…...

使用深度学习进行“序列到序列”分类

目录 加载序列数据 定义 LSTM 网络架构 测试 LSTM 网络 此示例说明如何使用长短期记忆 (LSTM) 网络对序列数据的每个时间步进行分类。 要训练深度神经网络以对序列数据的每个时间步进行分类,可以使用“序列到序列”LSTM 网络。通过“序列到序列”LSTM 网络,可以对…...

Python和Java的区别(不断更新)

主要通过几个方面区分Python和Java&#xff0c;让大家有一个对比&#xff1a; 语言类型 Java是一种静态类型、编译型语言。 Python是一种动态类型、解释型语言&#xff0c;注重简洁和灵活的语法。 语法 在Java中&#xff0c;变量需要显式地声明&#xff0c;指定其类型。例如&am…...

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(三)

八、ui窗体创建要点 .h文件定义(popwindowf.h)&#xff0c; TEST_TYPE_WINDOW宏是要创建的窗口样式。 #pragma once #include <gtk/gtk.h> G_BEGIN_DECLS #define TEST_TYPE_WINDOW (test_window_get_type()) G_DECLARE_FINAL_TYPE (TestWindow, test_window, TEST, WI…...

vue electron 应用在windows系统上以管理员权限打开应用

打开package.json文件&#xff0c;在build下的win增加配置 "requestedExecutionLevel": "requireAdministrator",...

c实现链表

目录 c实现链表 链表的结构定义&#xff1a; 链表的结构操作&#xff1a; 1、初始化链表 2、销毁链表 3、插入结点 4、输出链表数据 5、查找链表数据 扩展 代码实现 c实现链表 链表的结构定义&#xff1a; /*** 链表结构定义 ***/ typedef struct Node {int data; //…...

力扣231. 2 的幂(数学,二分查找,位运算)

Problem: 231. 2 的幂 文章目录 题目描述思路即解法复杂度Code 题目描述 思路即解法 思路1&#xff1a;位运算 1.易验证2的幂为正数&#xff1b; 2.易得2的幂用二进制表示只能有一个位为数字1 3.即将其转换为二进制统计其二进制1的个数 思路2&#xff1a;数学 当给定数n大于1时…...

Maven私服部署与JAR文件本地安装

Nexus3 是一个仓库管理器&#xff0c;它极大地简化了本地内部仓库的维护和外部仓库的访问。 平常我们在获取 maven 仓库资源的时候&#xff0c;都是从 maven 的官方&#xff08;或者国内的镜像&#xff09;获取。团队的多人员同样的依赖都要从远程获取一遍&#xff0c;从网络方…...

【MySQL】字符串函数的学习

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-J7VN4RbrBi51ozap {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...

AI助力农作物自动采摘,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建作番茄采摘场景下番茄成熟度检测识别计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…...

记录下ibus-libpinyin输入法的重新安装

目前的版本为&#xff1a; 首先把现在的ibus-libpinyin卸了 sudo apt-get --purge remove ibus-libpinyin sudo apt-get autoremove 安装教程请参考 Installation libpinyin/ibus-libpinyin Wiki GitHub yilai sudo apt install pkg-config sudo apt-get install lib…...

第三百一十八回

文章目录 1. 概念介绍2. 使用方法2.1 本地缓冲2.2 服务器缓冲3. 示例代码4. 内容总结我们在上一章回中介绍了"如何让输入键盘不遮挡屏幕"相关的内容,本章回中将介绍如何有效地缓冲网络图片.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的…...

破除Github API接口的访问次数限制

破除Github API接口的访问次数限制 1、Github介绍2、Github API接口2.1 介绍2.2 使用方法 3、Github API访问限制3.1 访问限制原因3.2 访问限制类别 4、Github API访问限制破除4.1 限制破除原理4.2 限制破除示例 1、Github介绍 Github&#xff0c;是一个面向开源及私有软件项目…...

蓝桥杯嵌入式第8届真题(完成) STM32G431

蓝桥杯嵌入式第8届真题(完成) STM32G431 题目 分析和代码 对比第六届和第七届&#xff0c;这届的题目在逻辑思维上确实要麻烦不少&#xff0c;可以从题目看出&#xff0c;这届题目对时间顺序的要求很严格&#xff0c;所以就可以使用状态机的思想来编程&#xff0c;拿到类似题…...

第二节 zookeeper基础应用与实战

目录 1. Zookeeper命令操作 1.1 Zookeeper 数据模型 1.2 Zookeeper服务端常用命令 1.3 Zookeeper客户端常用命令 1.3.1 基本CRUD 1.3.2 创建临时&顺序节点 2. Zookeeper JavaAPI操作 2.1 Curator介绍 2.2 引入Curator 2.3 建立连接 2.4 添加节点 2.5 修改节点 …...

3D Face HRN真实案例:用于司法鉴定中面部特征三维比对辅助系统

3D Face HRN真实案例&#xff1a;用于司法鉴定中面部特征三维比对辅助系统 1. 引言&#xff1a;从平面照片到三维证据的突破 在司法鉴定领域&#xff0c;面部特征比对一直是身份识别的重要技术手段。传统的2D照片比对方法存在角度、光照、表情等多重限制&#xff0c;往往难以…...

跨平台音频格式兼容性处理:让FRCRN支持更多音视频文件

跨平台音频格式兼容性处理&#xff1a;让FRCRN支持更多音视频文件 你有没有遇到过这种情况&#xff1f;精心搭建了一个基于FRCRN模型的音频降噪服务&#xff0c;信心满满地准备上线&#xff0c;结果用户一上传文件&#xff0c;服务就报错。有的用户传的是手机录的.m4a&#xf…...

XUnity.AutoTranslator游戏翻译解决方案:从入门到精通的实战指南

XUnity.AutoTranslator游戏翻译解决方案&#xff1a;从入门到精通的实战指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因语言障碍错失优秀的Unity游戏体验&#xff1f;面对满屏外文界面感到…...

嵌入式WebSocket客户端:零malloc、状态机驱动的轻量级实现

1. WebSocketClient 库深度解析&#xff1a;面向嵌入式系统的轻量级 WebSocket 客户端实现WebSocket 协议&#xff08;RFC 6455&#xff09;作为全双工通信的工业级标准&#xff0c;在嵌入式边缘设备与云平台、Web 控制台、MQTT 网关桥接等场景中已成刚需。然而&#xff0c;主流…...

3大突破!LxgwWenKai字体效率革命:从代码阅读到多场景适配全指南

3大突破&#xff01;LxgwWenKai字体效率革命&#xff1a;从代码阅读到多场景适配全指南 【免费下载链接】LxgwWenKai LxgwWenKai: 这是一个开源的中文字体项目&#xff0c;提供了多种版本的字体文件&#xff0c;适用于不同的使用场景&#xff0c;包括屏幕阅读、轻便版、GB规范字…...

DeepSeek技术解析:如何利用128K上下文窗口提升代码生成效率

1. 128K上下文窗口的技术革命 第一次看到DeepSeek支持128K上下文窗口时&#xff0c;我的反应和大多数开发者一样&#xff1a;"这数字是不是多打了个0&#xff1f;"毕竟在主流大模型还停留在32K上下文的时候&#xff0c;这个参数直接翻了四倍。但实测下来才发现&#…...

Lattice Diamond 3.11安装到实战:一个FPGA小白的避坑血泪史(附完整问题清单)

Lattice Diamond 3.11安装到实战&#xff1a;一个FPGA小白的避坑血泪史&#xff08;附完整问题清单&#xff09; 如果你正准备踏入Lattice FPGA的世界&#xff0c;手里攥着Diamond 3.11安装包&#xff0c;既兴奋又忐忑——这篇文章就是为你准备的。作为过来人&#xff0c;我深知…...

从Bootloader到App的优雅跳转:关键步骤与实战解析

1. 为什么需要Bootloader跳转App&#xff1f; 在嵌入式开发中&#xff0c;Bootloader和App的关系就像电脑的BIOS和操作系统。Bootloader负责硬件初始化、固件更新等底层工作&#xff0c;而App则是实现具体业务逻辑的主程序。两者分工明确&#xff0c;但最终需要无缝衔接。 我遇…...

OpenClaw飞书机器人配置:Qwen3-32B私有镜像对话触发详解

OpenClaw飞书机器人配置&#xff1a;Qwen3-32B私有镜像对话触发详解 1. 为什么选择OpenClaw飞书Qwen3-32B组合 去年底我开始尝试用AI自动化处理团队日常事务时&#xff0c;发现市面上大多数方案要么需要将敏感数据上传到第三方平台&#xff0c;要么只能完成简单的问答交互。直…...

nlp_structbert_sentence-similarity_chinese-large部署教程:模型量化INT8可行性分析

nlp_structbert_sentence-similarity_chinese-large部署教程&#xff1a;模型量化INT8可行性分析 1. 项目背景与模型介绍 StructBERT中文句子相似度分析工具是基于阿里达摩院开源的大规模预训练模型开发的本地化语义匹配解决方案。这个工具专门针对中文文本理解进行了优化&am…...