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.hqwc.cn/news/577692.html

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

相关文章

realsense标定

简介 参考&#xff1a; camera_calibration/Tutorials/MonocularCalibration - ROS Wiki 结果如下&#xff1a; 具体操作 安装 ros安装 先是安装ros 使用鱼香ros一键安装 推荐换源&#xff0c;哪怕有魔法 小鱼的一键安装系列 | 鱼香ROS wget http://fishros.com/inst…

<QT基础(4)>QLabel使用笔记

Label 前面的文章里面把QLabel批量引入ScrollArea作为预览窗口&#xff0c;这篇把图像填充到QLable的PixelMap展示指定图像。 参数设置 设置QLabel的大小格式 QWidget* widget new QWidget; widget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); widget->…

第二百三十回

文章目录 概念介绍添加方法示例代码指示器联动 我们在前面章回中介绍了PageView这个Widget,本章回中将介绍如何给PageView添加指示器.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的指示器表示PageView底部的小圆圈&#xff0c;它用来指示当前哪个页…

集合,排序查找算法,可变参数

文章目录 集合Set集合TreeSet集合 Map集合概述特点子类及其底层数据结构常用方法遍历 数据结构常见的数据结构二叉树 可变参数介绍格式注意 Collections工具类方法 排序查找算法冒泡排序介绍原理注意代码 选择排序介绍原理规律代码 二分查找前提介绍原理注意代码 集合 Set集合 …

flink: 将接收到的tcp文本流写入HBase

一、依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.o…

AcWing刷题-空调

空调 差分&#xff1a; N int(input()) p list(map(int, input().split())) t list(map(int, input().split())) d,s[0]*100010,[0]*100010 for i in range(N):d[i] p[i]-t[i]for i in range(N):s[i] d[i]s[i1] - d[i] ans 0 for i in range(N1):if s[i]>0:ans s[i]…

常见的Nginx+Redis+MQ+DB架构设计

三高&#xff0c;复杂的架构 SQRS CAP 缓存&#xff0c;限流 【Redis&#xff0c;缓存】 cache-aside 缓存cache&#xff1a;数据源的副本 store 1. Read/Write Through Pattern 读写穿透模式 redis&#xff1a;放当前在线用户&#xff0c;热点数据

三个对象组练习.java

题目&#xff1a;定义数组存储3部汽车对象&#xff1b;汽车属性&#xff1a;品牌&#xff0c;价格&#xff0c;颜色&#xff1b;创造3个汽车对象&#xff0c;数据通过键盘录入而来&#xff0c;并把数据存储到数组当中 分析&#xff1a; 在main&#xff08;&#xff09;里面定义…

java分割回文串(力扣Leetcode131)

分割回文串 力扣原题链接 问题描述 给定一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是回文串。返回 s 所有可能的分割方案。 示例 示例 1: 输入&#xff1a;s “aab” 输出&#xff1a;[[“a”,“a”,“b”],[“aa”,“b”]] 示例 2: 输…

简易挛生分拣系统设计

1 工效组合展示 2 方案规划设计 3 数字挛生建模 基础建模、动画设计、模型导出 4 软件体系架构 5 Web交互设计 5.1 页面架构 5.2 初始构造 5.3 模型运用 5.4 WS通信 5.5 运行展现 6 服务支撑编码 6.1 整体调度 6.2 WS服务 6.3 C/S通信 7 系统级调试完善

Chrome 插件各模块使用 Fetch 进行接口请求

Chrome 插件各模块使用 Fetch 进行接口请求 常规网页可以使用 fetch() 或 XMLHttpRequest API 从远程服务器发送和接收数据&#xff0c;但受到同源政策的限制。 内容脚本会代表已注入内容脚本的网页源发起请求&#xff0c;因此内容脚本也受同源政策的约束&#xff0c;插件的来…

鸿蒙开发第一节

一.开发准备-工具安装 1.鸿蒙开发官网&#xff1a;华为开发者联盟-智能终端能力开放,共建开发者生态 (huawei.com) 2.DevEco Studio3.1下载链接HUAWEI DevEco Studio和SDK下载和升级 | 华为开发者联盟 点击下载按钮进行下载2.1解压文件2.2双击运行此程序 2.3安装软件 点击N…