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

Android14之深入理解sp模板类(二百零二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:Android14之深入理解模板类

2.介绍

  • C++模板类是C++编程语言中的一种特性,它允许程序员定义能够处理任何类型数据的类。模板类是一种泛型编程的工具,可以在不牺牲性能的情况下提供类型安全的代码。在C++中,模板类可以用于创建可重用的、通用的代码,从而提高程序的可维护性和可扩展性。
  • 模板类的基本原理是模板参数。模板参数是一种特殊的参数,它在类定义时使用,用于指定类可以操作的数据类型。程序员可以在声明类时使用模板参数,然后在创建类的实例时指定具体的类型。这样,模板类就可以根据传入的类型参数生成相应的类实例,从而实现对不同类型数据的处理。
  • 模板类的基本语法如下:
template <class T>
class ClassName {
public:// 类成员函数和数据成员
};
  • 其中,<class T>表示模板参数,T是一个占位符,表示传入的具体类型。ClassName是类的名称,它可以是任何有效的C++类名。
  • 模板类具有以下特点:
  1. 类型安全:模板类通过编译时类型检查确保类型安全。在创建模板类的实例时,编译器会检查模板参数是否合法,并生成相应的类实例。这可以防止在运行时出现类型错误。
  2. 泛型编程:模板类允许程序员编写通用的代码,可以处理多种数据类型。这有助于减少代码冗余,提高程序的可维护性和可扩展性。
  3. 性能:模板类在编译时生成具体的类实例,因此在运行时不会产生额外的性能开销。模板类的设计目标是在不牺牲性能的情况下提供类型安全的代码。
  4. 兼容性:模板类可以与常规类混合使用。程序员可以在同一个项目中同时使用模板类和非模板类,以满足不同的编程需求。
  5. 继承:模板类可以被继承。子类可以继承模板类的特性,并可以添加新的功能或修改现有功能。这使得模板类可以作为基类,为子类提供通用的功能。
  • 举个例子,以下是一个简单的模板类,用于计算两个数值的和的平方:
template <class T>
class SumSquare {
public:T operator()(T a, T b) {return (a + b) * (a + b);}
};
  • 在这个例子中,SumSquare是一个模板类,它接受两个类型为T的参数ab,并返回它们的和的平方。程序员可以在创建SumSquare的实例时指定具体的类型,例如:
int result = SumSquare<int>(3, 4); // 创建 SumSquare<int> 的实例,计算 3 + 4 的和的平方
double result = SumSquare<double>(3.0, 4.0); // 创建 SumSquare<double> 的实例,计算 3.0 + 4.0 的和的平方
  • 总结起来,C++模板类是一种强大的编程工具,它提供了类型安全、泛型编程、性能和兼容性等优点。通过使用模板类,程序员可以编写可重用、通用的代码,提高程序的可维护性和可扩展性。

3.代码实例

<1>.Android智能指针sp用法实例

#include <utils/Log.h>
#include <string>
#include <iostream>
#include <utils/RefBase.h>using namespace std;class BB : public android::RefBase {
public:BB() {}
};int main() {//v1.0 android::sp<BB> bb = NULL;//bb.get() = NULLprintf("xxx--------------->%s, %s(), line = %d, bb.get() = %p\n",__FILE__,__FUNCTION__,__LINE__,bb.get());//v2.0android::sp<BB> b1 = new BB();printf("xxx--------------->%s, %s(), line = %d, b1.get() = %p\n",__FILE__,__FUNCTION__,__LINE__,b1.get());return 0;
}

v1.0传入空指针
v2.0传入实际类对象

<2>.自定义模板类实现(深入理解Android模板类sp的实现)

#include <memory>
#include <iostream>
using namespace std;template <typename T>
class Base {
public://1.模板类构造函数,传给模板类成员变量m_ptr.Base(T *other) : m_ptr(other){}//2.返回真正类的对象.T* get(){printf("xxx--------------->%s(), line = %d, m_ptr = %p\n",__FUNCTION__,__LINE__,m_ptr);return m_ptr;}private:T *m_ptr;
};class BB : public Base<BB>{
public://v1.0 不能使用默认构造函数,因为需要显示告诉Base模板类自己需要的类型,如果使用默认构造函数,它无法正确初始化基类,它不知道传递什么参数给基类的构造函数Base.//BB(){}//v2.0 传this,尚未完全构造的BB对象地址,this指针总是指向有效的BB对象,基类Base只是简单地存储了这个指针,并不进行任何依赖于对象完全构造的操作.BB() : Base<BB>(this){}void print(){printf("xxx--------------->%s(), line = %d\n",__FUNCTION__,__LINE__);}
};int main(void) {//v1.0: 模板类Base<BB>接收空指针NULL.Base<BB> b1 = nullptr;//or//Base<BB> b1 = Base<BB>(nullptr);cout << "b1.get() = " << b1.get() << endl;//v2.0: 将BB类实例化对象传入模板类Base<BB>.Base<BB> b2 = new BB();//Or//Base<BB> b2 = Base<BB>(new BB);cout << "b2.get() = " << b2.get() << endl;//1.b2:表示模板类Base<BB>对象//2.b2.get():表示模板类存放的BB实际类的指针对象.//3.b2.get()->print():表示调用模板类中BB类的成员函数print().b2.get()->print();//4.free BB实际对象.delete b2.get();//错误:BB类型的对象,而不是一个指针,不能使用delete来释放它.//delete b2;return 0;
}

注释已经很详细,就不多说了。

相关文章:

Android14之深入理解sp模板类(二百零二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

.NET core 5.0 及以上的Windows Service开发

首先&#xff0c;一定要和.NET Framework区分开&#xff0c; 详细请看微软的2023年的最新官方文档 Create Windows Service using BackgroundService - .NET | Microsoft Learn Create a Windows Service installer - .NET | Microsoft Learn 同样微软的官方微博给出了开发…...

Nginx配置文件解释

Nginx可以作为静态页面的web服务器&#xff0c;同时还支持CGI协议的动态语言&#xff0c;比如perl、php等。但是不支持java。Java程序只能通过与tomcat配合完成。Nginx专为性能优化而开发&#xff0c;性能是其最重要的考量,实现上非常注重效率 &#xff0c;能经受高负载的考验,…...

R语言赋值符号<-、=、->、<<-、->>的使用与区别

R语言的赋值符号有&#xff1c;-、、-&#xff1e;、&#xff1c;&#xff1c;-、-&#xff1e;&#xff1e;六种&#xff0c;它们的使用与区别如下: <-’&#xff1a;最常用的赋值符号。它将右侧表达式的值赋给左侧的变量&#xff0c;像一个向左的箭头。例如&#xff0c;x …...

ffmpeg重点之时间戳,PTS、DTS、time_base

PTS和DTS和时间基time_base 首先我们知道PTS是一帧音频或视频显示的时间&#xff0c;DTS是解码时间戳 既然是时间&#xff0c;PST和DTS的单位是什么呢?秒还是毫秒&#xff0c;抑或是纳秒&#xff1f; 先说结论—都不是 先引入FFmpeg中时间基的概念&#xff0c;也就是time_bas…...

OpenGL 实现“人像背景虚化“效果

手机上的人像模式,也被人们称作“背景虚化”或 ”双摄虚化“ 模式,也称为 Bokeh 模式,能够在保持画面中指定的人或物体清晰的同时,将其他的背景模糊掉。突出画面的主体部分,主观上美感更强烈。 人像模式的一般实现原理是,利用双摄系统获取景深信息,并通过深度传感器和图…...

基于springboot实现校园周边美食探索及分享平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现园周边美食探索及分享平台系统演示 摘要 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0c;互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域&#xff0c;传统的…...

AUTOSAR关于内存栈的分层及描述

首先关于关于内存栈的分层&#xff1a;如下图所示&#xff0c;Nvm靠近RTE的&#xff1b;MemIf居中&#xff0c;EA和FEE被包含其中。 其次关于这三层的缩写&#xff1a;可以看到EEPROM的模拟和EEPROM的抽象层。 我们可以看到 大概的数据流&#xff1a; 和大致的结构分层作用&am…...

windows powershell连接linux 上传下载文件

连接&#xff1a;输入下面命令&#xff0c;回车 输入密码进入linux系统 ssh root192.168.188.128退出linux logoutwindow上传文件到Linux服务器 把桌面的123.txt 上传到linux home文件夹下 scp C:\Users\pzx\Desktop\123.txt root192.168.188.128:/homelinux下载文件到windo…...

Vue生命周期,从听说到深入理解(全面分析)

每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xff0c;挂载实例到 DOM&#xff0c;以及在数据改变时更新 DOM。在此过程中&#xff0c;它也会运行被称为生命周期钩子的函数&#xff0c;让开发者有机会在特定阶…...

故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型的故障诊断(Matlab) 模型描述 CNN-BiLSTM卷积神经网络-双向长短期记忆神经网络组合模型是一种深度学习模型,结合了卷积神经网络(CNN)和双向长短期记忆网络(BiLSTM)的优点…...

iOS library not found for -lMBProgressHUD

0x00 前因 一开始是使用 CocoaPods 管理 MBProgressHUD&#xff0c;后来直接导入 MBProgressHUD 源码&#xff0c;就出现了这个错误&#xff1a;library not found for -lMBProgressHUD 0x01 后果 在 Xcode 工程目录中找到文件夹&#xff1a;Frameworks 看看里面是否有个红色…...

Paper Digest|基于在线聚类的自监督自蒸馏序列推荐模型

论文标题&#xff1a; Leave No One Behind: Online Self-Supervised Self-Distillation for Sequential Recommendation 作者姓名&#xff1a; 韦绍玮、吴郑伟、李欣、吴沁桐、张志强、周俊、顾立宏、顾进杰 组织单位&#xff1a; 蚂蚁集团 录用会议&#xff1a; WWW 2024 …...

【CTFshow 电子取证】套的签到题

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…...

SpringBoot集成Solr全文检索

SrpingBoot 集成 Solr 实现全文检索 一、核心路线 使用 Docker 镜像部署 Solr 8.11.3 版本服务使用 ik 分词器用于处理中文分词使用 spring-boot-starter-data-solr 实现增删改查配置用户名密码认证使用 poi 和 pdfbox 组件进行文本内容读取文章最上方有源码和 ik 分词器资源…...

厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能原理篇

接着上一篇《厨余垃圾处理设备工业监控PLC连接APP小程序智能软硬件开发之功能结构篇》继续总结一下厨余垃圾处理设备智能软硬件统的原理。所有的软硬件系统全是自己一人独自开发&#xff0c;看法和角度难免有局限性。希望抛砖引玉&#xff0c;将该智能软硬件系统分享给更多有类…...

google浏览器网站不安全与网站的连接不安全怎么办?

使用google谷歌浏览器访问某些网站打开时google谷歌浏览器提示网站不安全,与网站的连接不安全,您之所以会看到此警告,是因为该网站不支持https造成的怎么办? 目录 1、打开谷歌google浏览器点击右上角【┇】找到设置...

基于Axios封装请求---防止接口重复请求解决方案

一、引言 前端接口防止重复请求的实现方案主要基于以下几个原因&#xff1a; 用户体验&#xff1a;重复发送请求可能导致页面长时间无响应或加载缓慢&#xff0c;从而影响用户的体验。特别是在网络不稳定或请求处理时间较长的情况下&#xff0c;这个问题尤为突出。 服务器压力…...

深入理解指针(7)函数指针变量及函数数组(文章最后放置本文所有原码)

一、函数指针变量 什么是函数指针变量呢&#xff1f; 既然是指针变量&#xff0c;那么它指向的一定是地址&#xff0c;而且我们可以通过地址来调用函数的。 函数是否有地址呢&#xff1f;地址是什么&#xff1f; 经过上面的测试可以看到函数也是有地址的&#xff0c;而且其地…...

office办公技能|word中的常见使用问题解决方案2.0

一、设置多级列表将表注从0开始&#xff0c;设置为从1开始 问题描述&#xff1a;word中插入题注&#xff0c;出来的是表0-1&#xff0c;不是1-1&#xff0c;怎么办&#xff1f; 写论文时&#xff0c;虽然我设置了“第一章”为一级标题&#xff0c;但是这三个字并不是自动插入的…...

杰理之部分芯片跑2.3G出现连接不上【篇】

部分芯片跑2.3G出现连接不上...

AI提示工程与创意工作流:Claude+Cursor高效协作心法

1. 项目概述与核心价值 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫 zupp6869/claude-cursor-tips-for-creatives 。光看名字&#xff0c;你可能觉得这又是一个关于AI代码助手Cursor的普通教程合集。但如果你点进去&#xff0c;特别是你本身从事创意、设计、内容创作…...

从NASA航天电子设计看高可靠性电源与模拟电路工程实践

1. 从太空迷到电子工程师&#xff1a;我的技术启蒙之路我是一名不折不扣的太空迷。这个身份的烙印&#xff0c;始于童年时守在电视机前&#xff0c;目睹第一艘“水星号”载人飞船发射升空的那一天。沃尔特克朗凯特在新闻中从各个科学角度进行的详尽报道&#xff0c;让我整整一天…...

PyQt6 GUI开发实战:构建现代化桌面应用的架构设计指南

PyQt6 GUI开发实战&#xff1a;构建现代化桌面应用的架构设计指南 【免费下载链接】PyQt-Chinese-tutorial PyQt6中文教程 项目地址: https://gitcode.com/gh_mirrors/py/PyQt-Chinese-tutorial 在当今软件开发领域&#xff0c;桌面应用依然占据着重要地位&#xff0c;特…...

贾子理论体系:公理化东方智慧与现代科学工程化的认知范式

贾子理论体系&#xff1a;公理化东方智慧与现代科学工程化的认知范式摘要 贾子&#xff08;本名贾龙栋&#xff0c;笔名Kucius&#xff09;于2025–2026年间构建以“1-2-3-4-5”公理架构为核心的跨学科认知体系&#xff0c;涵盖思想主权元公理、两大规律、三大定律、四大支柱与…...

Umi-CUT:如何用一款免费工具实现批量图片去黑边与智能裁剪

Umi-CUT&#xff1a;如何用一款免费工具实现批量图片去黑边与智能裁剪 【免费下载链接】Umi-CUT 图片批量去黑边/裁剪/压缩工具&#xff0c;带界面。可排除图片边缘的色块干扰&#xff0c;将黑边删除干净。基于 Opencv 。 项目地址: https://gitcode.com/gh_mirrors/um/Umi-C…...

别再只懂BDF了!手把手教你理解PCIe ARI如何将Function数量扩展到256个

突破PCIe传统限制&#xff1a;深入解析ARI如何实现256个功能扩展 在数据中心和云计算架构快速发展的今天&#xff0c;虚拟化技术对硬件资源分配提出了更高要求。传统PCIe设备的8个功能限制已成为制约虚拟功能扩展的瓶颈&#xff0c;特别是在SR-IOV&#xff08;单根I/O虚拟化&am…...

别再手动描边了!用AutoCAD 2022画好异形PCB板框,一键导入Cadence SPB17.4

高效绘制异形PCB板框&#xff1a;AutoCAD与Cadence的无缝协作指南 在硬件设计领域&#xff0c;异形PCB板框的绘制一直是工程师们面临的挑战。传统矩形板框的绘制相对简单&#xff0c;但当项目需求涉及圆弧、缺口或不规则轮廓时&#xff0c;直接在Cadence Allegro中操作往往效率…...

Attu:向量数据库可视化管理工具的终极指南

Attu&#xff1a;向量数据库可视化管理工具的终极指南 【免费下载链接】attu The Best GUI for Milvus 项目地址: https://gitcode.com/gh_mirrors/at/attu 还在为复杂的向量数据库命令行操作而烦恼吗&#xff1f;Attu作为Milvus向量数据库的官方图形化管理工具&#xf…...

Linux 设备树深度解析之Amlogic SoC 多媒体

第一部分&#xff1a;Amlogic Canvas —— 视频像素缓冲区元数据中间件1.1 设计精髓分析Amlogic Canvas本质上是一个硬件级别的像素缓冲区描述符池。它存储每个编号对应的宽度、高度、物理地址、包裹模式、块模式&#xff08;GXBB及之后还支持端序&#xff09;等元数据。视频解…...