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

【C++ 面试 - 基础题】每日 3 题(十三)

✍个人博客:Pandaconda-CSDN博客

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

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

37. 什 么是函数对象?

函数对象(Function Object),也被称为函数子、函子,指的是具有函数行为的对象。它是一种可调用的对象,可以像函数一样被调用,具有函数的行为和特性。

在 C++ 中,函数对象是一种特殊的类对象,它重载了函数调用运算符 (),使得该对象可以像函数一样被调用。函数对象的实例可以存储状态,拥有成员变量和成员函数,因此更灵活,可以实现更复杂的操作逻辑。与普通函数相比,函数对象可以具有更多的上下文信息。

函数对象在许多应用场景中有用,例如:

  • 在算法和泛型编程中,函数对象可以作为算法的参数,对容器中的元素进行处理和操作。

  • 在多线程编程中,函数对象可以作为任务进行调度和执行。

  • 在回调函数中,函数对象可以传递和存储额外的上下文信息。

函数对象可以以多种方式定义,包括:

  • 函数指针:将函数指针作为函数对象,可通过重载函数调用运算符来实现。

  • 类对象:通过定义一个类对象并重载 operator() 运算符来实现函数对象。

下面是一个简单的示例,展示了如何定义和使用函数对象:

#include <iostream>
// 定义函数对象类
struct Add {int operator()(int a, int b) {return a + b;}
};
int main() {Add add;  // 创建函数对象实例int result = add(3, 4);  // 调用函数对象std::cout << "Result: " << result << std::endl;return 0;
}

输出结果为:

Result: 7

在上述示例中,我们定义了一个名为 Add 的函数对象类,重载了函数调用运算符,使得该对象可以像函数一样进行调用。然后,我们创建了一个函数对象实例 add,并使用它进行加法运算。

总结来说,函数对象是可调用的对象,除了函数指针外,C++中的函数对象主要通过类对象和重载运算符来实现。函数对象相对于普通函数更灵活,可以带有状态和行为,适用于多种编程场景。

38. 模 板的基本概念

C++ 模板类是一种通用编程技术,允许你编写通用的数据结构和算法,不仅可以处理不同数据类型,还可以处理不同数据结构的数据。

 1. 为什么使用模板类?

  • 模板类允许你编写通用的数据结构和算法,可以适用于不同的数据类型。

  • 它提高了代码的重用性,因为你可以使用相同的类定义来处理不同类型的数据。

  • C++ 标准库中的许多容器(例如 std::vectorstd::list)和算法(例如 std::sort)都是使用模板类实现的。

2. 模板 类的声明和定义

  • 模板类的声明以 template 关键字开始,后跟一个模板参数列表,使用 < > 括起来,通常包括类型参数。

  • 类的定义使用模板参数来指定类的成员的类型。

  • 类的成员函数可以在类内部定义,也可以在类外部定义。通常,成员函数的定义需要在类的模板声明之后提供。

    template <typename T>
    class MyTemplateClass {
    public:MyTemplateClass(T data);T getData();
    private:T data_;
    };template <typename T>
    MyTemplateClass<T>::MyTemplateClass(T data) : data_(data) {}template <typename T>
    T MyTemplateClass<T>::getData() {return data_;
    }
    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 3. 模板类的使用

  • 使用模板类时,你需要提供具体的数据类型,以实例化模板类。

  • 这可以通过提供模板参数来实现。例如,MyTemplateClass<int> 实例化了一个处理整数的模板类。

    MyTemplateClass<int> intInstance(42);
    MyTemplateClass<double> doubleInstance(3.14);

 4. 非类型模板参数

  • 除了类型参数,模板还支持非类型模板参数,这些参数可以是常数值、枚举或指针。

  • 非类型参数可以用于在编译时确定模板的一些属性。

    template <int Size>
    class FixedArray {
    public:int GetSize() { return Size; }// ...
    };

 5. 模板的特化和偏特化

  • 可以对特定类型的参数创建特化版本的模板类。

  • 偏特化允许你对模板参数的某些属性进行特化,以满足不同情况的需求。

    template <typename T>
    class MyTemplateClass;template <>
    class MyTemplateClass<int> {// Specialized implementation for int
    };

 6. 限定类型参数

  • 使用 typenameclass 关键字可以指定模板参数的类型。

  • 可以使用 typenameclass 以及适当的约束来限制接受的模板参数类型。

    template <typename T>
    void MyFunction(T value);

7. 模 板类的编译和实例化

  • C++ 中的模板类是在编译时实例化的。

  • 编译器根据使用模板类的上下文为特定类型生成实例化的类。

  • 这意味着只需提供一次模板定义,可以在不同地方和不同类型的数据上使用。

8. 模 板元编程

  • 模板类不仅可以用于创建通用数据结构,还可以用于进行元编程,生成和处理代码。

  • 使用模板元编程,你可以在编译时生成代码,以提高程序的性能和灵活性。

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

「引入原因」

编写单一的模板,它能适应多种类型的需求,使每种类型都具有相同的功能,但对于某种特定类型,如果要实现其特有的功能,单一模板就无法做到,这时就需要模板特例化。

「定义」对单一模板提供的一个特殊实例,它将一个或多个模板参数绑定到特定的类型或值上。

(1)模板函数特例化

必须为原函数模板的每个模板参数都提供实参,且使用关键字 template 后跟一个空尖括号对 <>,表明将原模板的所有模板参数提供实参,举例如下:

template<typename T> //模板函数
int compare(const T &v1,const T &v2)
{if(v1 > v2) return -1;if(v2 > v1) return 1;return 0;
}
//模板特例化,满⾜针对字符串特定的⽐较,要提供所有实参,这⾥只有一个T
template<>
int compare(const char* const &v1,const char* const &v2)
{return strcmp(p1,p2);
}

「本质」特例化的本质是实例化一个模板,而非重载它。特例化不影响参数匹配。参数匹配都以最佳匹配为原则。 例如,此处如果是 compare(3,5),则调用普通的模板,若为 compare(“hi”,”haha”) 则调用特例化版本(因为这个 cosnt char* 相对于 T,更匹配实参类型),注意二者函数体的语句不一样了,实现不同功能。

「注意」模板及其特例化版本应该声明在同一个头文件中,且所有同名模板的声明应该放在前面,后面放特例化版 本。

(2)类模板特例化

原理类似函数模板,不过在类中,我们可以对模板进行特例化,也可以对类进行部分特例化。对类进行特例化时, 仍然用 template<> 表示是一个特例化版本,例如:

template<>
class hash<sales_data>
{size_t operator()(sales_data& s);//⾥面所有T都换成特例化类型版本sales_data//按照最佳匹配原则,若T != sales_data,就用普通类模板,否则,就使用含有特定功能的特例化版本。
};

「类模板的部分特例化」

不必为所有模板参数提供实参,可以指定一部分而非所有模板参数,一个类模板的部分特例化本身仍是一个模板, 使用它时还必须为其特例化版本中未指定的模板参数提供实参(特例化时类名一定要和原来的模板相同,只是参数类型不同,按最佳匹配原则,哪个最匹配,就用相应的模板)

「特例化类中的部分成员」

可以特例化类中的部分成员函数而不是整个类,举个例子:

template<typename T>
class Foo
{void Bar();void Barst(T a)();
};
template<>
void Foo<int>::Bar()
{//进⾏int类型的特例化处理cout << "我是int型特例化" << endl;
}
Foo<string> fs;
Foo<int> fi;//使用特例化
fs.Bar();//使用的是普通模板,即Foo<string>::Bar()
fi.Bar();//特例化版本,执⾏Foo<int>::Bar()
//Foo<string>::Bar()和Foo<int>::Bar()功能不同

 

相关文章:

【C++ 面试 - 基础题】每日 3 题(十三)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…...

Android中的Binder

binder是Android平台的一种跨进程通信&#xff08;IPC&#xff09;机制&#xff0c;从应用层角度来说&#xff0c;binder是客户端和服务端进行通信的媒介。 ipc原理 ipc通信指的是两个进程之间交换数据&#xff0c;如图中的client进程和server进程。 Android为每个进程提供了…...

记录一次.gitignore 失效问题

前言 今天使用git同步同事的代码时&#xff0c;出现一个问题&#xff0c;.gitignore限制失效&#xff0c;导致我本地生成的临时缓存文件被跟踪到了commit中&#xff0c;执行 git rm --cache .后再add commit也不行&#xff0c;很奇怪就研究了一下&#xff0c;下面将我的解决方…...

Eclipse 工作空间

Eclipse 工作空间 Eclipse 工作空间&#xff08;Workspace&#xff09;是 Eclipse IDE 中一个核心概念&#xff0c;它指的是一个用于组织和存储开发项目及相关文件的目录。在 Eclipse 中&#xff0c;所有开发活动都是围绕工作空间展开的。本文将详细介绍 Eclipse 工作空间的概…...

[240812] X-CMD 发布 v0.4.5:更新 gtb、cd、chat、hashdir 模块功能

目录 &#x1f4c3;Changelog✨ gtb✨ cd✨ chat✨ hashdir &#x1f4c3;Changelog ✨ gtb 调整了 fzf 预览窗口中书籍文本的显示效果&#xff0c;通过识别文本中的特殊字符、日期、章节标题等信息&#xff0c;为其赋予不同的颜色。 ✨ cd cd 模块新增功能&#xff1a;在找…...

Flutter中的异步编程

目录 前言 1. Future 和 async/await 1.Future 1.什么是Future? 2.Flutter的三种状态 1.未完成&#xff08;Uncompleted&#xff09; 1.定义 2.处理未完成的Future 2.已完成(Completed with a value) 1.概念 2.处理已完成的Future 3.使用async/await 4.Fu…...

vue3 路由带传参跳转;刷新后消失。一次性参数使用。

解决vue3 怎么做到路由跳转传参刷新后消失 解决路由跳转传参去除问题 想要跳转后根据参数显示对应的tab&#xff0c;但url传参刷新会持续保留无法重置。 router.replace替换又会导致显示内容为router.replace后的&#xff0c;传参目的丢失。 业务逻辑&#xff1a; 完成对应操作…...

Unity新输入系统结构概览

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 在学习新输入系统之前&#xff0c;我们需要对其构成有个印象 1.输入动作&#xff08;Inputaction&#xff09; 是定义输…...

18104 练习使用多case解题

### 伪代码 1. 读取第1批测试数据的CASE数量。 2. 处理第1批测试数据&#xff0c;计算每个CASE的最小公倍数并输出。 3. 输出“group 1 done”。 4. 处理第2批测试数据&#xff0c;直到遇到两个0&#xff0c;计算每个CASE的最小公倍数并输出。 5. 输出“group 2 done”。 6. 处…...

【AI人工智能】文心智能体 - 你的专属车牌设计师

引言 自AI盛行以来&#xff0c;不断有各种各样的人工智能产品崭露头角。我们逐步跟着不断产生的人工智能来使自己的工作和生活变得更加智能化&#xff01;那么我们是否能够创造一款专属于自己的人工智能产品呢&#xff1f; 文心智能体平台就给我们提供了这样的机会&#xff0c…...

Linux-服务器硬件及RAID配置实验

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 1.Linux介绍、目录结构、文件基本属性、Shell 2.Linux常用命令 3.Linux文件管理 4.Linux 命令安装(rpm、install) 5.Linux账号管理 6.Linux文件/目录权限管理 7.Linux磁盘管理/文件系统 8.Linu…...

白屏检测系统的设计与实现

目录 一、 什么是白屏问题&#xff1f;二、 问题分析与拆解2.1 人工判定一个白屏问题的逻辑2.2 自动化判定一个白屏问题的算法思想 三、 白屏检测算法3.1 图像灰度化3.2 图像二值化3.3 计算&#xff08;判定为白屏&#xff09;置信度 四、 白屏检测系统的设计与实现4.1 UI自动化…...

Real-Time Open-Vocabulary Object Detection:使用Ultralytics框架进行YOLO-World目标检测

Real-Time Open-Vocabulary Object Detection&#xff1a;使用Ultralytics框架进行YOLO-World目标检测 前言相关介绍前提条件实验环境安装环境项目地址LinuxWindows 使用Ultralytics框架进行YOLO-World目标检测进行训练进行预测进行验证 扩展目标跟踪设置提示 参考文献 前言 由…...

区块链用什么编程语言实现?

. 主流区块链的开发语言主要有&#xff1a;C、Go、Java、Rust、C#。 C使用率最高&#xff0c;其次是Go&#xff0c;很少有人用python开发区块链。...

【网络编程】UDP通信基础模型实现

udpSer.c #include<myhead.h> #define SER_IP "192.168.119.143" #define SER_PORT 7777 int main(int argc, const char *argv[]) {//1.创建int sfd socket(AF_INET,SOCK_DGRAM,0);if(sfd -1){perror("socket error");return -1;}//2.连接struct…...

Docker Compose 常用命令详解

Docker Compose 常用命令详解 Docker Compose 是 Docker 官方编排工具之一&#xff0c;用于定义和运行多容器 Docker 应用程序。通过 docker-compose.yml 文件&#xff0c;开发者可以轻松管理服务、网络、卷以及各服务之间的依赖关系。以下将介绍一些常用的 Docker Compose 命…...

超级外链工具,可发9600条优质外链

超级外链工具&#xff0c;是一款在线全自动化发外链的推广工具。使用本工具可免费为网站在线批量增加外链&#xff0c;大大提高外链发布工作效率&#xff0c;是广大草根站长们必备的站长工具。 外链工具只是网站推广的辅助工具&#xff0c;一般适用于短时间内无法建设大量外链…...

VisionPro二次开发学习笔记13-使用CogToolBlock进行图像交互

该程序演示了如何使用CogToolBlock进行图像交互. 从vpp文件中加载一个ToolBlock。 用户可以通过应用程序窗体上的数字增减控件修改ToolBlock输入端子的值。 用户还可以从coins.idb或采集FIFO中选择图像。 “运行一次”按钮执行以下操作&#xff1a; 获取下一个图像或读取下一…...

比特币价格分析:市场重置完成,下一个目标:70,000 美元

比特币再次处于关键支撑位&#xff0c;面临可能影响其短期前景的关键考验。分析师们正密切关注比特币是否重复熟悉的模式&#xff0c;暗示可能出现重大走势。 OKNews分析师Josh表示&#xff0c;比特币一直处于看跌趋势&#xff0c;正如 4 日图上的超级趋势指标所示。这种趋势的…...

大模型笔记5 Extractive QA任务评估

目录 Extractive QA任务评估 Extractive QA评测指标 precision, recall, f1 ROUGE 划分训练与评估数据集 token位置评估 单个token位置评估 输入label的token位置 预测token位置 评估 Wandb 共享机器同时登录 样本类别平衡 标记token label时对窗口进行筛选 训练…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github&#xff1a;https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...