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

C++基础讲解第八期(智能指针、函数模板、类模板)

C++基础讲解第八期 代码中也有对应知识注释,别忘看,一起学习!

  • 一、智能指针
  • 二、模板
    • 1. 概念
    • 2.函数模板
      • 1. 函数模板和普通函数
    • 3. 类模板
      • 1.类模板的定义
      • 2.举个例子
      • 3.举例

一、智能指针

举个栗子:
看下面代码, 当我们直接new一个指针时, 忘记delete了, 那么会造成内存泄漏,我们必须手动的去delete指针
但是当我们使用智能指针的时候, 我们不去delete的时候,它会自动调用析构函数去销毁指针, 类似于java中的垃圾回收机制

#include<iostream>
#include<memory>
using namespace std;class Test
{public:Test(){cout<<"Test的构造函数"<<endl;}void print(){cout<<"xxx"<<endl;}~Test(){cout<<"Test的析构函数"<<endl;}
};void f1()
{Test* t1 = new Test;
}void f2()
{auto_ptr<Test> my_memory(new Test);my_memory->print();
}int main()
{f1();f2();return 0;
}result:
Test的构造函数
Test的构造函数
xxx
Test的析构函数

二、模板

1. 概念

将函数的返回值和参数的类型 参数化, 也称为泛型编程

2.函数模板

C++提供了一套机制,建立一个通用函数,其函数参数的类型和返回值类型不具体指定,用一个虚拟的类型来代替

#include<iostream>
using namespace std;/*
int add(int x, int y)
{return x + y;
}double add(double x, double y)
{return x + y;
}
虽然在C++中我们可以使用函数重载,如上:通过传参类型不同,调用对应的同名接口
但是问题是,我们还是需要将这个功能函数实现两遍
*///所以衍生出了模板
template <typename T>   //声明虚拟类型T,我们传什么,它就是什么
T add(T x, T y)
{return x + y;
}template <typename T1, typename T2>//模板T的作用域只到它的下一个函数结束
void show(T1 x, T2 y)
{cout<< x<<" " <<y<<endl;
}int main()
{cout <<add(1,2)<<endl;        //隐式调用cout <<add(1.11,2.22)<<endl;cout <<add<int>(1,'a')<<endl; //显式调用show(1,'a');show<double, char>(1.11, 'a'); //显示调用return 0;
}result:
3
3.33
98
1 a
1.11 a

1. 函数模板和普通函数

当普通函数和模板函数同时出现时, 优先使用普通函数
普通函数可以进行默认类型转化
模板函数没有默认的类型转换

#include<iostream>
using namespace std;int add(int x, int y)
{cout<<"普通函数"<<endl;return x + y;
}double add(double x, double y)
{return x + y;
}template <typename T>   //声明虚拟类型T,我们传什么,它就是什么
T add(T x, T y)
{cout<<"模板函数"<<endl;return x + y;
}template <typename T1, typename T2>//模板T的作用域只到它的下一个函数结束
void show(T1 x, T2 y)
{cout<< x<<" " <<y<<endl;
}int main()
{cout <<add(1,2)<<endl;        //当普通函数和模板函数同时出现时, 优先使用普通函数cout <<add<int>(1,'a')<<endl; //只有模板函数才有显式调用, 模板函数没有默认的类型转换cout <<add(1,'a')<<endl;      //普通函数可以进行默认类型转化//show(1,'a');//show<double, char>(1.11, 'a'); //显示调用return 0;
}

3. 类模板

1.类模板的定义

类模板中定义的函数类型可以用在类声明和类实现中
类模板的目的同样是将数据类型参数化
并且在实例化对象的时候,一定要显式调用

2.举个例子

#include<iostream>
using namespace std;template<typename T, typename U>
class Test
{private:T a;U b;public:Test(T a, U b){this->a = a;this->b = b;}void show(){cout<<a << " "<< b <<endl;}
};int main()
{Test<int, char> t(1, 'a');//类模板创建对象,一定要显式调用t.show();return 0;
}

3.举例

#include<iostream>
using namespace std;template <typename T, typename U>
class Parent
{protected:T a;U b;public:Parent(T a, U b){this->a = a;this->b = b;}void show(){cout<<a << " "<< b <<endl;}
};class Child:public Parent<int, char> //模板类派生普通类,继承时,要对基类实例化,显示继承
{public:Child(int a, char b): Parent(a, b){}void show(){cout<<a<<" "<<b<<endl;}
};template<typename T, typename U>
class Child2:public Parent<T, U> //模板类派生模板类,继承的同时,不需要对基类实例化
{private:U c;public:Child2(T a, U b, U c): Parent<T, U>(a, b){this->c = c;}void show(){cout<<this->a<<" "<<this->b<<" "<<this->c<<endl;}
};int main()
{Child c1(1, 'a');c1.show();Child2<int, double> c2(1,1.11,2.22);c2.show();return 0;
}

相关文章:

C++基础讲解第八期(智能指针、函数模板、类模板)

C基础讲解第八期 代码中也有对应知识注释&#xff0c;别忘看&#xff0c;一起学习&#xff01; 一、智能指针二、模板1. 概念2.函数模板1. 函数模板和普通函数 3. 类模板1.类模板的定义2.举个例子3.举例 一、智能指针 举个栗子: 看下面代码, 当我们直接new一个指针时, 忘记dele…...

JMeter 测试 ActiveMq

JMeter 测试 ActiveMq 的资料非常少&#xff0c; 我花了大量的时间才研究出来 关于ActiveMq 的文章请参考我另外的文章。 版本号: ActiveMq 版本号: 5.91 Jmeter 版本号: 1.13 添加ActiveMq 的jar包 将 ActiveMq 下的 "activemq-all-5.9.1.jar" 复制…...

2023年4月和5月随笔

1. 回头看 为了不耽误学系列更新&#xff0c;4月随笔合并到5月。 日更坚持了151天&#xff0c;精读完《SQL进阶教程》&#xff0c;学系统集成项目管理工程师&#xff08;中项&#xff09;系列更新完成。 4月和5月两月码字114991字&#xff0c;日均码字数1885字&#xff0c;累…...

新Linux服务器安装Java环境[JDK、Tomcat、MySQL、Nacos、Redis、Nginx]

文章目录 JDK服务Tomcat服务MySQL服务Nacos服务Redis服务Nginx服务 说明&#xff1a;本文不使用宝塔安装 温馨提示宝塔安装命令&#xff1a;yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh JDK服务…...

精简总结:一文说明软件测试基础概念

基础概念-1 基础概念-2 目录 一、什么是软件测试&#xff1f; 二、软件测试的特点 三、软件测试和开发的区别 1、内容&#xff1a; 2、技能区别 3、工作环境 4、薪水 5、发展前景 6、繁忙程度 7、技能要求 四、软件测试与调试的区别 1、角色 2、目的 3、执行的阶…...

通过 Gorilla 入门机器学习

机器学习是一种人工智能领域的技术和方法&#xff0c;旨在让计算机系统能够从数据中学习和改进&#xff0c;而无需显式地进行编程。它涉及构建和训练模型&#xff0c;使其能够自动从数据中提取规律、进行预测或做出决策。 我对于机器学习这方面的了解可以说是一片空白&#xf…...

【二叉树】298. 二叉树最长连续序列

文章目录 一、题目1、题目描述2、基础框架3、原题链接 二、解题报告1、思路分析2、时间复杂度3、代码详解 三、本题小知识 一、题目 1、题目描述 给你一棵指定的二叉树的根节点 root &#xff0c;请你计算其中 最长连续序列路径 的长度。 最长连续序列路径 是依次递增 1 的路…...

Matlab论文插图绘制模板第100期—紧凑排列多子图(Tiledlayout)

不知不觉&#xff0c;《Matlab论文插图绘制模板》系列来到了第100期。 在此之前&#xff0c;其实我也没想到会有这么多种数据可视化表达方式&#xff0c;论文里不是折线图就是柱状图&#xff0c;单调的很。 假如研究生那会要是能遇到现在的自己&#xff08;分享的内容&#x…...

[2.0快速体验]Apache Doris 2.0 日志分析快速体验

1. 概述 应用程序、服务器、云基础设施、IoT 和移动设备、DevOps、微服务架构—最重要的业务和 IT 发展趋势帮助我们以前所未有的方式优化运维和客户体验。但这些趋势也导致由机器生成的数据出现爆炸式成长&#xff0c;其中包括日志和指标等&#xff0c;例如&#xff0c;用户交…...

MySQL学习-数据库创建-数据库增删改查语句-事务-索引

MySQL学习 前言 SQL是结构化查询语言的缩写&#xff0c;用于管理关系数据库(RDBMS)中的数据。SQL语言由IBM公司的Donald Chamberlin和Raymond Boyce于20世纪70年代开发而来&#xff0c;是关系型数据库最常用的管理语言。 使用SQL语言可以实现关系型数据库中的数据处理、数据…...

浏览器渗透攻击-渗透测试模拟环境(9)

介绍了浏览器供给面和堆喷射技术。 “客户端最流行的应用软件是什么,大家知道吗?” 这个简单的问题,你当然不会放过:“当然是浏览器,国内用得最多的估计还是 IE 浏览器,其实 360安全浏览器遨游啥的也都是基于IE内核的。” “OK,浏览器是客户端渗透攻击的首要目标,目前IE…...

MySQL数据库基础(基础命令详解)

1、数据库操作 1.1、显示当前的数据库 SHOW DATABASES; 1.2、创建数据库 CREATE DATABASE IF NOT EXISTS 库名&#xff1b; 1.3、使用数据库 USE 库名; 1.4、删除数据库 DROP DATABASE IF EXISTS 库名&#xff1b; 说明&#xff1a;数据库删除之后&#xff0c;内部看不到对应…...

企业培训直播场景下嘉宾连线到底是如何实现的?

企业培训直播场景下&#xff0c;进行音视频连线的嘉宾&#xff0c;都拥有面向学员教学的权限&#xff0c;支持多位老师/专家异地同堂授课&#xff0c;那么&#xff0c;这种嘉宾连线到底是如何实现的&#xff1f; 企业培训&#xff0c;如何做到不受时间和地点限制&#xff0c;实…...

五、JSP05 分页查询及文件上传

五、JSP 分页查询及文件上传 5.1 使用分页显示数据 通过网络搜索数据时最常用的操作&#xff0c;但当数据量很大时&#xff0c;页面就会变得冗长&#xff0c;用户必须拖动才能浏览更多的数据 分页是把数据库中需要展示的数据逐页分步展示给用户 以分页的形式显示数据&#xff…...

一起看 I/O | 借助 Google Play 管理中心价格实验,优化定价策略

作者 / Google Play 产品经理 Phalene Gowling 今年 Google I/O 大会上的 "通过 Google Play Commerce 提升收益" 演讲重点为您介绍了深度集成至 Google Play 的最新创收工具。此工具专注于帮您优化定价策略。为您的产品或内容确定合适的价格是实现更出色的用户生命周…...

hexview 命令行操作使用说明

hexview 命令行操作使用说明 命令行操作基础格式 hexview.exe infile [option] -o outfile提取部分内容 hexview.exe app.hex /AR:0X200000-0X303404 /s /XI -o app1.hex/AR&#xff1a;指定提取的范围。&#xff08;也可以使用/CR&#xff0c;它可以指定多个范围&#xff0…...

vue3+element plus,使用分页total修改成中文

vue3element plus&#xff0c;使用分页total修改成中文 使用element plus的分页功能 el-pagination 的时候&#xff0c;total属性显示是英文 这是我建的一个新项目&#xff0c;总数显示的Total 1000 我们的需求是显示中文&#xff0c;共 1000 条 这个就很尴尬&#xff0c;组件…...

RPC、HTTP、DSF、Dubbo,每个都眼熟,就是不知道有什么联系?

一、HTTP 和 RPC 首先&#xff0c;http 与 rpc 有什么区别这个问题不太严谨&#xff0c;因为这俩就不是一个层级的东西。 HTTP 这个大家太熟悉了吧&#xff1f;日常接触最多的恐怕就是各种http协议的接口了。 没错&#xff0c;http它是一个协议。 其他在这里就不打算铺开了…...

java.security.MessageDigest的用法

java.security.MessageDigest MessageDigest的含义 message含义是:消息,信息 digest的含义是 digest 必应词典 n.摘要&#xff1b;文摘&#xff1b;概要&#xff1b;汇编 v.消化&#xff1b;领会&#xff1b;领悟&#xff1b;理解 海词 n. 摘要 vt. 消化&#xff1b;理解 vi…...

3.2 分析特征间的关系

3.2 分析特征间的关系 3.2.1 绘制散点图 scatter()例子1&#xff1a;绘制2000-2017年各季度国民生产总值散点图例子2&#xff1a;使用不同颜色不同形状的点&#xff0c;绘制2000-2017年各产业各季度国民生产总值散点图 3.2.2 绘制折线图 plot()例子1&#xff1a;绘制2000-2017年…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

书籍“之“字形打印矩阵(8)0609

题目 给定一个矩阵matrix&#xff0c;按照"之"字形的方式打印这个矩阵&#xff0c;例如&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为&#xff1a;1&#xff0c;…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统

核心速览 研究背景 ​​研究问题​​&#xff1a;这篇文章要解决的问题是当前大型语言模型&#xff08;LLMs&#xff09;在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色&#xff0c;但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成&#xff08;RA…...

理想汽车5月交付40856辆,同比增长16.7%

6月1日&#xff0c;理想汽车官方宣布&#xff0c;5月交付新车40856辆&#xff0c;同比增长16.7%。截至2025年5月31日&#xff0c;理想汽车历史累计交付量为1301531辆。 官方表示&#xff0c;理想L系列智能焕新版在5月正式发布&#xff0c;全系产品力有显著的提升&#xff0c;每…...