当前位置: 首页 > 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;但是这三个字并不是自动插入的…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...