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;
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】引领未来的力量:技术革新与应用探索

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…

【No.17】蓝桥杯图论上|最短路问题|Floyd算法|Dijkstra算法|蓝桥公园|蓝桥王国(C++)

图的基本概念 图&#xff1a; 由点(node&#xff0c;或者 vertex)和连接点的边(edge)组成。图是点和边构成的网。 树&#xff1a;特殊的图树&#xff0c;即连通无环图树的结点从根开始&#xff0c;层层扩展子树&#xff0c;是一种层次关系&#xff0c;这种层次关系&#xff0…

铁道障碍物检测6种YOLOV8

铁道障碍物检测6种&#xff0c;采用YOLOV8训练&#xff0c;得到PT模型&#xff0c;然后转换成ONNX模型&#xff0c;OPENCV调用 铁道障碍物检测6种YOLOV8

开发者的瑞士军刀:DevToys

DevToys&#xff1a; 一站式开发者工具箱&#xff0c;打造高效创意编程体验&#xff0c;让代码生活更加得心应手&#xff01;—— 精选真开源&#xff0c;释放新价值。 概览 不知道大家是否在windows系统中使用过PowerToys&#xff1f;这是微软研发的一项免费实用的系统工具套…

css3鼠标悬停图片特效,图片悬停效果源码

特效介绍 css3鼠标悬停图片特效,图片悬停效果源码&#xff0c;可以在网页上面作为自己的动态加载名片&#xff0c;放到侧边栏或者网站合适的位置即可 动态效果 代码下载 css3鼠标悬停图片特效,图片悬停效果源码

解决mysql问题: this is incompatible with sql_mode=only_full_group_by

今天在部署一趟测试环境的服务&#xff0c;各种配置文件都配好了&#xff0c;启动服务后台报错&#xff0c;解决后记录一下&#xff0c;小伙伴们也可以看看&#xff01; ### Cause: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause…

35岁不是程序员终点站:转型、坚守还是涅槃

程序员35岁会失业吗&#xff1f; 35岁被认为是程序员职业生涯的分水岭&#xff0c;许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长&#xff0c;技术更新换代的速度会使得资深程序员难以跟上&#xff1b;而另一些人则认为&#xff0c;丰富的经验…

代码随想录算法训练营第四十六天|139.单词拆分、56. 携带矿石资源(第八期模拟笔试)

139.单词拆分 刷题https://leetcode.cn/problems/word-break/description/文章讲解https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html视频讲解https://www.bilibili.com/video/BV1pd4y147Rh/?vd_sourceaf4853e80f89e28094a5fe1e220d9062 题解&…

C语言:给结构体取别名的4种方法

0 前言 在进行嵌入式开发的过程中&#xff0c;我们经常会见到typedef这个关键字&#xff0c;这个关键字的作用是给现有的类型取别名&#xff0c;在实际使用过程中往往是将一个复杂的类型名取一个简单的名字&#xff0c;便于我们的使用。就像我们给很熟的人取外号一样&#xff…

无人驾驶(移动机器人)路径规划之A star(Tie Breaker)算法及其matlab实现

在自动驾驶与移动机器人路径规划时&#xff0c;必定会用到经典的算法A star。下面是我未加入与加入Tie Breaker 的matlab实现效果。可以发现加入Tie Breaker之后效果明显改善。 目录 一、效果比较 1.未加入Tie Breaker&#xff08;黑色为障碍物&#xff0c;菱形绿色为目标点…

python3游戏GUI--开心打地鼠游戏By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;游戏预览1.启动2.开始游戏3.游戏结束4.排行榜 三&#xff0e;游戏思路四&#xff0e;总结 一&#xff0e;前言 第一次用PyQt做游戏&#xff0c;有点小紧张呢。本次使用PyQt5制作一款简单的打地鼠游戏&#xff0c;支持基本游戏玩法、…

Bytebase 签约 PropertyGuru,助力东南亚最大地产科技平台跨国多地数据库变更自动化

PropertyGuru 是东南亚最大的在线房地产平台&#xff0c;于2022年于纽交所&#x1f4c8;上市&#xff0c;总部位于新加坡 &#x1f1f8;&#x1f1ec;。公司利用先进的技术&#xff0c;建立了一个连接多方的在线房产平台&#xff0c;一方面为中介代理商、开发商、银行等机构提供…

Kimi是什么?免费Kimi chat介绍

1. Kimi是什么&#xff1f; Kimi是由月之暗面科技有限公司&#xff08;Moonshot AI&#xff09;开发的人工智能助手&#xff0c;专注于提供高质量的对话和信息处理服务。 月之暗面公司创立于2023年3月&#xff0c;创始团队核心成员参与了Google Gemini、Google Bard、盘古NLP、…

文献学习-22-Surgical-VQLA:具有门控视觉语言嵌入的转换器,用于机器人手术中的视觉问题本地化回答

Authors: Long Bai1† , Mobarakol Islam2† , Lalithkumar Seenivasan3 and Hongliang Ren1,3,4∗ , Senior Member, IEEE Source: 2023 IEEE International Conference on Robotics and Automation (ICRA 2023) May 29 - June 2, 2023. London, UK Abstract: 尽管有计算机辅…

Jira 软件缺陷管理 (软件测试)

内容来源&#xff1a;总结黑马课程 1.软件缺陷信息 2.创建缺陷问题 2.1 缺陷模板 2.2 创建缺陷问题模板

HarmonyOS系统开发ArkTS常用组件编程技巧

目录 样式复用 Styles方法 Extend方法 组件编程在使用过程中有很多技巧&#xff0c;在这里分享样式复用技巧和UI结构复用技巧。 样式复用 我们观察下面的代码&#xff0c;在代码中很多重复行的代码&#xff0c;如&#xff1a; Image 的 .width(30).height(30) 是重复的But…

150 Linux C++ 通讯架构实战5 nginx源码学习方法,终端和进程的关系,信号的复习,fork复习,守护进程复习

一 nginx源码学习方法 泛读 nginx 中的一些重要代码 把 nginx中最重要的代码提取出来作为我们自己知识库的一部分。 二 终端和进程的关系 pts 是虚拟终端的意思&#xff0c;也就是我们用的xshell之类的链接linux的终端 1.终端 &#xff0c; shell &#xff0c; bash 的关系 在…

【链表】Leetcode 146. LRU 缓存【中等】

LRU 缓存 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否…

CTF题型 Python中pickle反序列化进阶利用例题opache绕过

CTF题型 pickle反序列化进阶&例题&opache绕过 文章目录 CTF题型 pickle反序列化进阶&例题&opache绕过一.基础的pickle反序列化例题1.[HFCTF 2021 Final]easyflask2.[0xgame 2023 Notebook]3.[[HZNUCTF 2023 preliminary\]pickle](https://www.nssctf.cn/proble…

大数据系列 | 使用Nginx作为数据采集接收端

大数据系列 | 使用Nginx作为数据采集接收端 1. 编译安装Nginx2. 通过程序对Nginx上传日志 1. 编译安装Nginx Nginx依赖包安装&#xff1a; rootnginx:~# apt install -y vim lua-devel gcc gcc-c autoconf automake zlib zlib-devel openssl openssl-devel gcc zlib1g-dev lib…