C++中类模板的定义和使用

类模板的定义和使用

  • 引言
  • 类模板
    • 声明和定义
      • 有问有答
    • 示例
    • 运行结果
    • 注意
      • 参数传递
      • ref

引言

类模板就是一个模板,但是数据可以适用多种类型。类模板使用时需要模板的特例化,就变成了模板类。
本文只要是记录一下模板的使用。同时对于引用和右值引用传参做一下记录。

类模板

声明和定义

类模板的声明和定义一般都是放在同一个文件中,将其文件后缀名改为hpp。

有问有答

为什么要将类模板的声明和定义放在同一个函数

  1. 类模板在编译的时候进行模板实例化,若将声明与定义分别放在两个文件中,可能会出现找不到模板的定义,导致编译错误。
  2. 且由于模板实例化发生在编译时,而不是链接时,因此不需要为模板生成单独的目标文件。如果声明和定义分开,编译器可能会尝试为模板的定义生成目标文件,这会导致链接错误。

为什么头文件为hpp

hpp文件允许函数的声明和定义放在一个文件中。且声明为hpp后,一看头文件的名字就知道声明与定义在一个文件中。

示例

下面是一个类模板的示例。
Counter.hpp

#pragma once
template<typename T>
class MyClass
{
public:
	MyClass();
	~MyClass();
	void setValue(T& val);
	T* getValue()const;
	T getData()const;
private:
	T* m_ptr;
};

template<typename T>
MyClass<T>::MyClass() :m_ptr(nullptr)
{
	m_ptr = new T;
}

template<typename T>
MyClass<T>::~MyClass()
{
	delete m_ptr;
	m_ptr = nullptr;
}

template<typename T>
void MyClass<T>::setValue(T& val) {
	*m_ptr = val;
}

template<typename T>
T* MyClass<T>::getValue()const {
	return m_ptr;
}

template<typename T>
inline T MyClass<T>::getData() const
{
	return T(*m_ptr);
}

main.cpp

#include <iostream>
#include "Counter.hpp"

using namespace std;


int main(int argc,char *argv[]) {
    MyClass<int> obj;
    int a = 45;
    obj.setValue(a);//右值引用可以使用右值,或者将左值转换为右值来传递参数,左值引用只能使用左值传递参数
    cout << "设置后其地址为:" << obj.getValue() << endl;
    cout << "设置后其值为:" << obj.getData() << endl;
	return 0;
}

运行结果

在这里插入图片描述

注意

参数传递

  1. 引用
    上面的示例中,void setValue(T& val);参数为左值引用,此时在调用函数setValue的时候,传入参数时需要传入一个变量,而不能传入一个数值。
   obj.setValue(3);

这样会编译不通过。左值引用为变量的别名。
2. 右值引用
当将上面的函数改为void setValue(T&& val);其参数为右值引用类型,这时调用函数setValue时,传参需要使用move移动语义。

void setValue(T&& val);

template<typename T>
void MyClass<T>::setValue(T&& val) {
	*m_ptr = val;
}

使用的时候,可以使用move传参。

#include <iostream>
#include "Counter.hpp"

using namespace std;


int main(int argc,char *argv[]) {
    MyClass<int> obj;
    int a = 45;
    obj.setValue(move(a));//右值引用可以使用右值,或者将左值转换为右值来传递参数,左值引用只能使用左值传递参数
    cout << "设置后其地址为:" << obj.getValue() << endl;
    cout << "设置后其值为:" << obj.getData() << endl;
	return 0;
}

当然,也可以直接使用一个右值来传参。下面数值3就是一个右值。

#include <iostream>
#include "Counter.hpp"

using namespace std;


int main(int argc,char *argv[]) {
    MyClass<int> obj;
    obj.setValue(3);//右值引用可以使用右值,或者将左值转换为右值来传递参数,左值引用只能使用左值传递参数
    cout << "设置后其地址为:" << obj.getValue() << endl;
    cout << "设置后其值为:" << obj.getData() << endl;
	return 0;
}

ref

ref用于函数式传参,可以用于bind对象绑定器的传参,也可以用于thread线程传参。在对象绑定器中所指向的函数形参为引用时,若直接使用变量来传参,就会出现拷贝,而使用ref包装一下变量,就使用变量的引用,可以改变变量自身的值,不会出现拷贝。
详情可以参考:
ref的初步讲述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

几个redis常用命令

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 ping&#xff1a;测试连接是否存活 例如&#xff1a;测试当前redis数据库是否存活 127.0.0.1:6379> ping #返回PONG&am…

RHEL9 DNF/YUM仓库管理软件包

DNF/YUM仓库管理软件包 一个基于RPM包的软件包管理器能够从指定的服务器自动下载RPM包并且安装&#xff0c;自动处理依赖性关系&#xff0c;并且一次性安装所有依赖的软件包C/S模式 Server服务端提供RPM软件包与数据库文件repodataClient客户端使用dnf仓库 常用组合 组合参…

半导体湿法技术有什么优势

湿法蚀刻工艺的原理是使用化学溶液将固体材料转化为液体化合物。选择性非常高&#xff0c; 因为使用的化学品可以非常精确地适应单个薄膜。对于大多数解决方案&#xff0c;选择性大于100:1。 批量蚀刻 在批量蚀刻中&#xff0c;可以同时蚀刻多个晶圆&#xff0c;过滤器和循环…

返回值不同算方法重载么?为什么?

1、典型回答 返回值不同不算方法重载 方法重载&#xff08;Overloading&#xff09;是指在同一个类中定义了多个同名方法&#xff0c;但它们的参数列表不同&#xff0c;方法重载要求方法&#xff1a; 名称相同参数类型、参数个数或参数顺序&#xff0c;至少有一个不同 方法…

【SQL】601. 体育馆的人流量(with as 临时表;id减去row_number()思路)

前述 知识点学习&#xff1a; with as 和临时表的使用12、关于临时表和with as子查询部分 题目描述 leetcode题目&#xff1a;601. 体育馆的人流量 思路 关键&#xff1a;如何确定id是连续的三行或更多行记录 方法一&#xff1a; 多次连表&#xff0c;筛选查询方法二&…

普发Pfeiffer氦质谱检漏仪HLT260/270系列电路图电路板图纸和接线针脚含义非常详细内部国外资料中英操作说明培训PPT课件打包13个文档

普发Pfeiffer氦质谱检漏仪HLT260/270系列电路图电路板图纸和接线针脚含义非常详细内部国外资料中英操作说明培训PPT课件打包13个文档

使用 gin-api-mono 创建简单的 TODO 服务

介绍 首先介绍一下 gin-api-mono 这个项目&#xff0c;这个项目是由 go-gin-api 作者基于用户的需求衍生出来的一个项目。因为有些用户觉得 go-gin-api 是一个前后端都有的一个开源项目&#xff0c;对于很多用户来说&#xff0c;前端部分是不需要的&#xff0c;所以作者看到这…

护眼灯什么价位的好用?推荐五款好价护眼台灯

如今&#xff0c;我们不难发现许多年轻人早早地就戴上了眼镜&#xff0c;近视问题日益严重。在改善近视问题的众多因素中&#xff0c;营造适宜的照明环境&#xff0c;特别是选择一款合适的护眼台灯&#xff0c;显得尤为重要。然而&#xff0c;对于初次选购护眼台灯的人来说&…

通过sqoop把hive数据到mysql,脚本提示成功,mysql对应的表中没有数

1、脚本执行日志显示脚本执行成功&#xff0c;读写数量不为0 2、手动往Mysql对应表中写入数据十几秒后被自动删除了 问题原因&#xff1a; 建表时引擎用错了&#xff0c;如下图所示 正常情况下应该用InnoDB

Request和Response对象

Request和Response都是Servlet的service方法的参数&#xff0c;Request负责获取请求数据&#xff0c;而Response负责设置相应数据~ 一.Request 1.继承体系 Tomcat负责解析数据&#xff0c;因此由Tomcat来提供实现类~ 2.获取请求数据 请求行 请求头 请求体 需要注意的是只有…

【Greenhills】MULTI IDE工程管理的目录结构

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 关于的GHS的Project Manager中工程的目录结构的组成 2、 问题场景 在GHS中去创建项目后&#xff0c;对于在Project Manager窗口中的目录结构不太清晰&#xff0c;目录中有多个gpj文件&#xff0c;无法确认哪个是…

掼蛋如何识人

掼蛋的吸引力在于其充满变化和挑战性。它不仅仅可以考验玩家的技巧、智慧和决策能力&#xff0c;也是一种社交活动。通过玩家之间的出牌习惯和方式&#xff0c;能快速帮助我们推测出对方的思维方式和性格特征。 一、保守型 这类玩家按部就班&#xff0c;在游戏开始的时候&#…

【JAVA】HashMap扩容性能影响及优化策略

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在软件开发中&#xff0c;HashMap是一种常用的数据结构&#xff0c;但在处理大量数据时&#xff0c;其扩容…

广西省行政村边界shp数据/广西省乡镇边界/广西省土地利用分类数据/径流分布

广西壮族自治区&#xff0c;地处中国南部&#xff0c;北回归线横贯中部。南北以贺州——东兰一线为界&#xff0c;此界以北属中亚热带季风&#xff0c;以南属南亚热带季风。 数据范围&#xff1a;全国行政区划-行政村界 数据类型&#xff1a;面状数据&#xff0c;全国各省市县…

华为数通方向HCIP-DataCom H12-821题库(多选题:141-160)

第141题 以下关于802.1X认证的触发机制,描述正确的有? A、802.1X认证不能由认证设备(如802.1交换机)发起 B、802.1X客户端可以组播或广播方式触发认证 C、认证设备可以以组播或单播方式触发认证 D、802.1X认证只能由客户端主动发起 【参考答案】BC 【答案解析】 第142题 以…

java-ssm-基于jsp商场停车服务管理信息系统

java-ssm-基于jsp商场停车服务管理信息系统

Python网站的搭建和html基础

1.Python网站代码及讲解 一般我们搭建小型的网站就用flask库就行了。 &#xff08;1&#xff09;安装flask库 安装完python后&#xff0c;按住windows徽标键和r,弹出“运行”&#xff0c;在里面输入cmd。 回车打开&#xff0c;输入“pip install flask”。 &#xff08;2&am…

WAServiceMainContext.js:2 ReferenceError: result is not defined

WAServiceMainContext.js:2 ReferenceError: result is not defined at success (index.js? [sm]:280) at Function.forEach.u.<computed> (WASubContext.js?twechat&s1710205354985&v2.16.1:2) at :22955/appservice/<api request success callback fun…

53、WEB攻防——通用漏洞CRLF注入URL重定向资源处理拒绝服务

文章目录 CRLF注入原理&检测&利用URL重定向web拒绝服务 CRLF注入原理&检测&利用 URL重定向 就是url中存在urlhttps://xxx&#xff0c;重定向的页面没有限制。主要用来做钓鱼。 web拒绝服务 例如&#xff0c;图片的长宽参数由前端传入&#xff0c;恶意的数据…

初级爬虫实战——伯克利新闻

文章目录 发现宝藏一、 目标二、简单分析网页1. 寻找所有新闻2. 分析模块、版面和文章 三、爬取新闻1. 爬取模块2. 爬取版面3. 爬取文章 四、完整代码五、效果展示 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…