C++泛型编程学习(三)——类模板

腾讯开源CubeSandbox:为Agent打造可随时丢弃的安全沙箱环境 在人工智能与自动化技术快速发展的今天,智能体(Agent)在执行复杂任务时往往需要独立、完整的计算环境,但环境失控带来的安全风险一直是落地瓶颈。为解决这一痛点,可丢弃式沙箱技术应运而生。它通过轻量虚拟化原理实现环境秒级重建,并严格隔离宿主资源,即使Agent执行了恶意或误操作,也不会波及其他系统。这种技术价值在于平衡了灵活性与安全性,使开发者敢于赋予Agent更多自主操作权限。目前,这类技术已广泛应用于AI编程、自动化测试、数字员工、恶意代码分析等真实场景,成为Agent可靠运行的基石。腾讯开源的CubeS 阅读详情

目录

前言

C++泛型编程学习(二)——类模板中已经介绍了如何在一个文件中,把类模板的方法和实现分开,这里主要记录下类模板的声明和定义分别写在头文件中的方法。

类模板实例

功能:实现一个数组模板类,完成对int、char、Teacher类型元素的管理。这时候如何在Teacher类中有指针类型,就会出现深拷贝和浅拷贝的问题。
- main.cpp

#include <iostream>
#include "MyVector.cpp"    // 模板类必须包含成".cpp",一直出现错误,可能和是在code block中编译有关
#include <string.h>

using namespace std;

class Teacher
{
public:
    friend ostream & operator<<(ostream& out, Teacher &t);
    Teacher& operator=(const Teacher& obj)
    {
        if(m_p != NULL)
        {
            delete[] m_p;
            m_p = NULL;
            age = 33;
        }
        m_p = new char[strlen(obj.m_p)+1];
        strcpy(m_p, obj.m_p);
        age = obj.age;

        return *this;
    }
public:
    Teacher()
    {
        age = 33;

        m_p = new char[1];

        strcpy(m_p, "");
    }

    // 在构造函数中,对Teacher的指针变量分配内存
    Teacher(char* name, int age)
    {
        this->age = age;
//        strcpy(this->name, name);
        m_p = new char[strlen(name)];
        strcpy(m_p, name);
    }

    Teacher(const Teacher& obj)
    {
        m_p = new char[strlen(obj.m_p)+1];
        strcpy(m_p, obj.m_p);
        age = obj.age;
    }

    ~Teacher()
    {
        if(m_p != NULL)
        {
            delete[] m_p;  // 
            m_p = NULL;
        }
    }


    void printT()
    {
        cout << "name:" << m_p << " " << "age:" << age << endl;
//        cout << "name:" << name << endl;
//        cout << "age:" << age << endl;
    }
protected:
private:
    int age;
//    char name[32];
    char* m_p;
};

ostream & operator<<(ostream& out, Teacher &t)
{
    out << t.m_p << " " << "age=" << t.age << endl;

    return out;
}

int main()
{
    Teacher t1("t1", 31), t2("t2", 32), t3("t3", 33), t4("t4", 34);
    myVector<Teacher*> tArray(4);

    tArray[0]  = &t1;
    tArray[1]  = &t2;
    tArray[2]  = &t3;
    tArray[3]  = &t4;

    for(int i=0; i<4; i++)
    {
        Teacher *tmp = tArray[i];
        tmp->printT();
    }

    return 0;
}
  • MyVector.h
#ifndef MYVECTOR_H
#define MYVECTOR_H

#include <iostream>

using namespace std;

template <typename T>
class myVector
{
//    friend ostream& operator<< <T>(ostream &out, const myVector &obj);
public:
    myVector(int size=0);
    myVector(const myVector &obj);  // 拷贝构造函数
    virtual ~myVector();    // 析构函数

    T& operator[](int index);
    myVector &operator=(myVector &obj);
    int getLen()
    {
        return m_len;
    }
protected:
    int m_len;
    T *m_space;
private:

};

#endif // MYVECTOR_H
  • MyVector.cpp
#include "MyVector.h"

#include <iostream>

using namespace std;

//在本编译器中使用友元失败
//template <typename T>
//ostream & operator<<(ostream &out, const myVector<T> &obj)
//{
//    for(int i=0; i<obj.m_len; i++)
//    {
//        out << obj.m_space[i] << " ";
//    }
//    return out;
//}

template <typename T>
myVector<T>::myVector(int size)
{
    m_space = new T[size];
    m_len = size;
}

template <typename T>
myVector<T>::~myVector()
{
    if(m_space != NULL)
    {
        delete [] m_space;
        m_space = NULL;
        m_len = 0;
    }
}

template <typename T>
myVector<T>::myVector(const myVector &obj)
{
    // 根据myV1的大小分配内存
    m_len = obj.m_len;
    m_space = new T[m_len];
    for(int i=0; i<obj.m_len; i++)
    {
        m_space[i] = obj.m_space[i];
    }
}

template <typename T>
T& myVector<T>::operator[](int index)
{
    return m_space[index];
}

// a3 = a2 = a1
template <typename T>
myVector<T> & myVector<T>::operator=(myVector<T> &obj)
{
    // 先把a2的旧的内存释放掉
    if(m_space != NULL)
    {
        delete [] m_space;
        m_space = NULL;
        m_len = 0;
    }

    // 根据a1分配内存,拷贝数据
    m_len = obj.m_len;
    m_space = new T[m_len];
    for(int i=0; i<obj.m_len; i++)
    {
        m_space[i] = obj.m_space[i];
    }

    return *this;   // a2=a1
}

类模板小结

  1. 模板是C++类型参数化的多态工具。C++提供函数模板和类模板
  2. 模板定义以模板说明开始。类属参数必须在模板定义中至少出现一次。
  3. 同一个类属参数可以用于多个模板。
  4. 类属参数可以用于函数的参数类型、返回类型和声明函数中的变量。
  5. 模板由编译器根据实际数据类型实例化,生成可执行代码。实例化的函数模板称为模板函数;实例化的类模板称为模板类
  6. 函数模板可以用多种方式重载。
  7. 类模板可以在类层次中使用。

总结

实践才能理解的更深刻,这里大概有个运行的程序感觉就够了。
附上《传智播客扫地僧c++基础和进阶课堂讲义.docx》下载地址。

N5105 PVE UEFI核显直通Windows:从黑屏到HDMI输出的实战调优 本文详细介绍了在N5105处理器上实现PVE UEFI核显直通Windows的实战调优方法。针对黑屏和HDMI音频无法识别等常见问题,提供了系统参数调整、驱动模块加载、虚拟机配置等解决方案,帮助用户成功实现核显直通并优化性能。 阅读详情

相关推荐

有限元缺陷:剪切锁死

有限元缺陷:剪切锁死

wsxww11的博客 5190

Qt专栏之C++预习篇(四)

Qt专栏之C++预习篇(四)C++的秘密1.C++对象内存模型2.泛型编程3.异常设计规范C++设计规范 用Qt写上位机软件真的超级方便,小小编在这边分享一些如何从零开始通过Qt来制作上位机软件。 我们预习回顾下Qt使用的编程语言,本文旨在阐述C++的设计规范以及补充速记点 C++的秘密 1.C++对象内存模型 对象模型的底层实现机制由于编译器的不同并未实现标准化。推荐一篇详细的好文章(篇幅较长,耐心看完,定有收获): C++对象模型:https://www.cnblogs.com/developin

Time to Forget 1121

NVIDIA NCCL 安装和测试实战教程

ibrary)是用于深度学习应用的高性能通信库,可加速多GPU通信和同步。它能够在多个GPU之间进行高效的数据传输和集体操作,显著提高了分布式GPU系统上深度学习训练和推理的性能。NVIDIA NCCL是加速多GPU系统上深度学习应用的必不可少的工具。其高效的通信原语和集体操作显著提高了分布式训练和推理的性能,使其成为现代深度学习基础架构的关键组成部分。

weixin_39818775的博客 4430

QT中的数据类型

1、常用数据类型 1.1、基本数据类型 基本数据类型qint8、quint8、qint16、quint16、qint32、quint32、qint64、quint64、qreal 1.2、常用接口 1.2.1、求绝对值 //T是泛型,以下都是T qAbs(const T &t) 1.2.2、求最大值和最小值 //求最大值和最小值,会把最大或最小的返回出来 T &qMax(const T &value1, const T &...

顺其自然~专栏 4912

机器视觉/将HIK海康面阵相机连接Halcon软件

本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。

Dahe.qu 4867

以ATT&CK为例构建网络安全知识图

随着攻击工具、方法的逐渐升级和复杂化,安全数据的大规模融合,攻防对抗愈加激烈。安全团队如何在浩瀚数据中有效发现高级威胁的蛛丝马迹,如何把网络安全专家的经验、知识有效转化为可复制可扩展的数据分析能力,如何将对抗高级威胁的“炼金术”逐步升级为科学淘金指南,如何将安全从业者从繁重的体力劳动中解放出来,愈发成为安全能力亟需突破的难点和重点,也是我们正在探索的方向。正如医疗行业中治疗疑难杂症依赖医疗专家,网络空间高级威胁的防护和处置也依赖安全专家的经验与知识。

2401_88752684的博客 1092

泛型设计中的模板

所谓泛型(generic),是指那些能够像操作基本类型一样轻松操作对象的类和函数。Qt容器类是范型类,也是基于模板的范型类。范型与模板C++支持四种不同的类型: 基本类型:int,char,float,double等 指针 类和结构的实例 数组 因为这四种不同类型之间不存在公共基类型,所以如果不使用模板,要编写能够对多种类型进行操作的范型函数和类将会非常可能。例如:int max(int x,int

何亮5083的博客 559

新政下的绿电直连项目经济性分析:模式创新与价值重构

随着全球气候治理与低碳转型进程不断加速,绿电直连作为新能源就近消纳的创新模式,正成为破解新能源消纳瓶颈、规避碳关税壁垒的核心路径。2025年9月,国家发展改革委、国家能源局发布《关于完善价格机制促进新能源发电就近消纳的通知》(1192号文),为绿电直连项目的经济性分析与效益测算提供了明确的政策依据。本文将基于新政框架,深入解析绿电直连项目的经济性影响因素、盈利模式与优化路径,并结合案例与量化模型,为项目投资决策提供系统参考。

getusushu的博客 140

编写泛型函数————第八章心得

文章目录1 概念1.1 泛型编程1.2 模版实例化1.3 注意点2 迭代器种类2.1 输入迭代器(顺序只读访问)2.2 输出迭代器(顺序只写访问)2.3 正向迭代器(顺序读-写访问)2.4 双向迭代器(可逆访问)2.5 随机访问迭代器(随机访问)3 迭代器区间和越界值 1 概念 1.1 泛型编程 函数对一个未知类型的参数的使用方式会对这个参数的类型产生约束。 例如:如果要计算x+y,为了让运算结果...

韩江雪de 小屋 1191

[Python人工智能] 三十六.基于Transformer的商品评论情感分析 (2)keras构建多头自注意力(Transformer)模型

本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章利用Keras构建深度学习模型并实现了情感分析。这篇文章将介绍Transformer基础知识,并通过Keras构建多头自注意力(Transformer)模型,实现IMDB电影影评数据情感分析。基础性文章,希望对您有所帮助!...

杨秀璋的专栏 4909

基于STM32L4XX、HAL库的AD7124-8BCPZ模数转换器ADC驱动程序设计

/ 公式: Voltage = (adc_value / (2^23 - 1)) * Vref。// 模式控制位[7:5]=000 (连续转换模式)// 3.2 配置通道0,使其使用AIN0(+)和AIN1(-),并关联到配置0和滤波器0。= 0x14) { // AD7124-8的ID是0x14。// 双极性操作,缓冲AINP/AINN。

zhusl6688的博客 377

泛型

泛型 Java泛型本质是参数化类型,把类型作为参数传递。 常见形式有泛型类、泛型接口、泛型方法。 语法:<T, …> T称为类型占位符,表示一种引用类型。如果编写多个使用逗号隔开。 好处: 提高代码的重要性; 防止类型转换异常,提高代码的安全性。 参考代码(创建泛型) //泛型类 语法:类名<T> //T是类型占位符,表示一种引用类型,如果编写多个使用逗号隔开 public class MyGeneric<T> { //使用泛型T //1.创建

weixin_46649583的博客 219

AutoSAR从0开始实战 --- 目录

​​​​​​本专栏是全网最真实的AutoSAR实战专栏,博主将从一个0基础小白的身份来讲解AutoSAR工具的配置,以及相应代码的讲解。

wj博客 1729

【C++初阶】八、初识模板(泛型编程、函数模板、类模板)

C++初识模板:泛型编程 ;函数模板 ;类模板

正在努力学C呀!(要学好久呢......) 7931

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++泛型编程

C++泛型编程与STL总结1. 泛型编程1.1 模板1.2 函数模板1.2.1 语法1.2.2 使用函数模板方式1.2.3 普通函数和函数模板的区别1.2.4 普通函数与函数模板的调用规则1.2.5 模板的局限性1.3 类模板2. STL技术 1. 泛型编程 泛型编程最初诞生于C++中。目的是为了实现C++的STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数T。(参考自Bai

蹦跶跶 6889

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【C++】泛型编程——模板初阶

泛型编程——模板初阶:函数模板的概念、使用、原理、实例化、匹配原则;类模板

m0_70980326的博客 2338

C++初阶:入门泛型编程(函数模板和类模板)

这是这次的大概内容:1.泛型编程 2.函数模版 2.1概念 2.2格式 2.3函数模版的原理 2.4函数模版的实例化 2.4.1隐式实例化 2.4.2显示实例化 2.5 模板参数的匹配原则 3.类模板 3.1概念 3.2格式 3.3类模板的实例化

qq_74415153的博客 4302

【C++】泛型编程

函数模板是C++泛型编程的基础之一,它允许我们定义一个通用的函数框架,能够处理不同数据类型的操作。其定义方式需要借助template关键字,后面紧跟尖括号,在尖括号内声明类型参数。a : b;/*在这个例子中,template 声明了这是一个函数模板,其中typename表明T是一个类型参数,你也可以使用class关键字来代替typename,效果是一样的。在函数体中,T就如同一个占位符,可以代表任意数据类型。

2302_78829275的博客 2245

《C++初阶之STL》【泛型编程 + STL简介】

本文介绍了C++泛型编程的核心概念及其在STL中的应用。通过分析传统重载函数的局限性,引出泛型编程的优势——通过模板实现代码复用,避免冗余。重点讲解了函数模板的原理(编译时自动生成特定类型代码)和两种实例化方式(隐式/显式)。文章采用比喻(如"代码模具")和代码示例,生动阐释了模板如何抽象数据类型,提升开发效率。作为STL学习的基础,本文强调理解泛型思想对后续掌握容器、算法等组件的重要性。

序属秋秋秋的博客 1997

C++泛型详解

如果要在函数模板内部使用这样的类型,必须显示告诉编译器这个名字是一个类型,否则编译器无法得知它是一个类型还是一个值。模板形参可以是表示类型的类型形参(type parameter),也可以是表示常量表达式的非类型形参(nontype parameter)。编译器将确定用什么类型代替每个类型形参,用什么值代替每个非类型形参,然后产生并编译(称为实例化)该版本的函数。在定义的类模板中,使用模板形参作为类型或值的占位符,在使用类时再提供具体的类型或值。函数模板是一个独立于类型的函数,可以产生函数的特定类型版本。

程序猿老樊的博客 5252

【C++基础篇】学习C++就看这篇--->泛型编程之模板

C++模板是编写与类型无关的通用代码的泛型编程手段。函数模板能为不同数据类型生成函数实例,通过 template<typename T> 或 template<class T> 声明,使用时编译器按需实例化。类模板用于定义通用类,如模板类实现不同数据类型的栈结构,实例化时需指定类型。

熬夜秃顶中...... 1565

C++泛型编程之模板

模板的知识详解

m0_72532428的博客 1850

C++泛型和泛型编程(通俗理解+模板程序)

1、泛型是什么? 泛型编程是什么? 实质上就是不使用具体数据类型(int、double、float等),而是使用一种通用类型来进行程序设计的方法,泛泛的描述一下数据,这个方法可以大规模的减少程序代码的编写量。 模板函数如下: 其中,T是一个占位符(数据类型占位符),也就是说,将来T这个位置是一个真实的、具体的数据类型。 所以,可以把T这种类型占位符也称为一种数据类型,就叫泛型(generic type)。使用这种类型占位符的编程方式就叫泛型编程。 总之,泛型也是一种数据类型,但它是用来代替所有类型的“通用类

weixin_45758146的博客 6846

【C++】模板编程和泛型编程

模板编程是C++中一种强大的编程技术,它允许程序员编写能够处理多种不同数据类型的通用代码,而无需为每种数据类型都单独编写一份几乎相同的代码。通过使用模板,我们可以将代码的逻辑与具体的数据类型分离,提高代码的复用性和可维护性。泛型编程是一种更广泛的编程范式,它不仅仅局限于C++中的模板编程,还涵盖了其他语言中类似的实现通用代码的方式。泛型编程的核心思想是编写与具体数据类型无关的代码,通过抽象出类型参数等手段,使得代码能够在不同的数据类型上进行复用,以达到提高代码效率、可维护性和通用性的目的。

Guiat的博客 1749

【C++破局】泛型编程|函数模板|类模板

文章由浅入深的介绍了C++中强大的泛型编程技术,文章主要聚焦于函数模板和类模板的用法和细节知识点问题。通过详细解释函数模板的定义、实例化和使用,以便学习如何通过一套通用的函数定义来处理不同数据类型,从而提高代码的灵活性和可维护性。类模板的部分将更为深入地探讨如何创建通用的类,使其能够适应多种数据类型,实现代码的高度重用。

lovewold_的博客 1311

【C++】C++泛型编程 | 模板初阶

🌀 本章给大家带来的是C++泛型编程—模板。C++是C语言的扩展,注重面向对象编程及泛型编程。泛型编程是一种基于参数化的编程方式,简单来说就是编写具有通用性,可以适用于不同类型数据的代码。模板就是C++中实现泛型编程的一种重要手段。🌀C++中的模板允许程序员编写一套泛型代码,可以适用于不同的数据类型,因此称之为“模板”。模板可以分为函数模板和类模板两种形式。函数模板可以让程序员编写一个通用的函数(函数的参数或返回值是泛型类型),可以适用于各种不同的数据类型。

Welcome home | Jian Liao 's blog 1248

【C++】——模板(泛型编程+函数模板+类模板)

本文给大家带来的是C++中模板相关的知识点,其中包括了泛型编程、函数模板、类模板。帮助大家对模板有更加清晰的认识。

_Fiora的博客 930
上一篇: C++泛型编程学习(二)——类模板
下一篇: C++的类型转换
simonXi-tech
博客等级 码龄10年 398粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值