首页 > 其他分享 >模板函数和模板类

模板函数和模板类

时间:2024-03-19 09:31:40浏览次数:18  
标签:函数 int template n1 NumberCalculator 模板

模板函数的小小的案例

环境:vscode

T_Case.h

// 需求:定义一个模板函数,实现对一个数组中对元素进行升序排序
#include <iostream>
using namespace std;
template <typename T>
void mySort(T array[], int len)
{
    for (int index = 0; index < len - 1; index++)
    {
        int minIndex = index;
        for (int k = index + 1; k < len; k++)
        {
            if (array[minIndex] > array[k])
            {
                minIndex = k;
            }
        }
        if (minIndex != index)
        {
            T temp = array[index];
            array[index] = array[minIndex];
            array[minIndex] = temp;
        }
    }
}
// 需求:定义一个模板函数,实现将一个数组中对元素拼接成为字符串返回
template <class T>
void showArray(T array[], int len)
{
    if (len == 0)
    {
        cout << "[]" << endl;
        return;
    }
    cout << "[";
    for (int i = 0; i < len - 1; i++)
    {
        cout << array[i] << ", ";
    }
    cout << array[len - 1] << "]" << endl;
}

T_Case.cpp

#include <iostream>
#include "T_case.h"
int main()
{

    // 定义一个int[]
    int array1[] = {1, 3, 5, 7, 9, 0, 8, 6, 4, 2};
    int len1 = sizeof(array1) / sizeof(int);
    mySort(array1, len1);
    showArray(array1, len1);

    // 定义一个double[]
    double array2[] = {3.14, 9.28, 3, 3.44, -9.2, 8.22};
    int len2 = sizeof(array2) / sizeof(double);
    mySort(array2, len2);
    showArray(array2, len2);

    // 定义一个char[]
    char array3[] = {'a', 'l', '1', 'm', 'k'};
    int len3 = sizeof(array3) / sizeof(char);
    mySort(array3, len3);
    showArray(array3, len3);

    return 0;
}

类模板的继承

#include <iostream>
using namespace std;
//模版类中的虚拟类型是不能继承的
template <typename T>
class Animal{
public:
T arg;
};
//普通类继承类模板,需指定父类中的虚拟类型
class Dog:public Animal<int>{

};
//类模板继承类模板
template <typename E>
class Cat:public Animal<E>{

};
int main(){
    Dog xiaobai;
    xiaobai.arg=10;
    Cat<string>xiaohei;
    xiaohei.arg="abc";
    return 0;
}

类模板中的成员函数创建时机

class Dog {
public:
    void bark() { cout << "汪汪" << endl; }
}

class Cat {
public:
    void sleep() { cout << "呼呼" << endl; }
}

template<typename T>
class Person {
public:
    T pet;
    
    void makeBark() {
        pet.bark();
    }
    
    void makeSleep() {
        pet.sleep();
    }
}

int main() {
    // 在类设计完成后,直接编译程序,发现是没有问题的。
    
    // 调用makeBark函数的时候,也是没有问题的,可以正常调用。
    Person<Dog> xiaobai;
    xiaobai.makeBark();
    
    // 调用makeSleep函数的时候就出问题了,不能调用了!
	xiaobai.makeSleep();
    
    // 原因:类模板中的成员函数是在调用的时候才会创建的!
    // 因为在编译的时候,只是知道有一个对象是Pet,但是具体是什么类型,不知道!
    // 在调用makeBark的时候,创建了这个函数,而我们设置的类型是Dog类型,没有问题,可以正常执行
    // 在调用makeSleep的时候,创建了这个函数,判断pet的类型是Dog类型,而在Dog类中不存在sleep函数,因此就报错了。
    
    return 0;
}

类模板类外实现

在C++中,当类模板的成员函数在类外实现时,需要指定模板类的类型。这是因为在类模板定义之后,编译器无法确定类模板的具体实例化类型,所以在类外实现成员函数时需要明确告诉编译器这个成员函数是属于哪个类模板实例的。

template<typename T, typename M>
class NumberCalculator {
private:
    T n1;
    M n2;
public:
    NumberCalculator() {}
    NumberCalculator(T n1, M n2);
    
    void add();
};
// 构造函数类外实现
template<typename T, typename M>
NumberCalculator<T, M>::NumberCalculator(T n1, M n2) {
    this->n1 = n1;
    this->n2 = n2;
}
// 普通函数类外实现
template<typename T, typename M>
NumberCalculator<T, M>::add() {
    cout << n1 + n2 << endl;
}

类模板遇到友元

// 全局友元函数类外实现-03:定义类
template<typename T, typename M>
class NumberCalculator;

// 全局友元函数类外实现-02:在类之前定义
template<typename T, typename M>
void printNumberCalculator(const NumberCalculator<T, M>& op) {
    cout << "n1 = " << op.n1 << ", n2 = " << op.n2 << endl;
}

template<typename T, typename M>
class NumberCalculator {
    // 全局友元函数类内实现,无需进行什么处理,直接在这里写实现即可。
    /*
    friend void printNumberCalculator(const NumberCalculator<T, M>& op) {
        cout << "n1 = " << op.n1 << ", n2 = " << op.n2 << endl;
    }
     */

    // 全局友元函数类外实现—01:在函数的后面添加一对尖括号,表示一个模板函数
    friend void printNumberCalculator<>(const NumberCalculator<T, M>& op);
private:
    T n1;
    M n2;
public:
    NumberCalculator();
    NumberCalculator(T n1, M n2);
};

template<typename T, typename M>
NumberCalculator<T, M>::NumberCalculator(T n1, M n2) {
    this->n1 = n1;
    this->n2 = n2;
}

template<typename T, typename M>
NumberCalculator<T, M>::NumberCalculator() = default;


int main() {

    NumberCalculator<int, int> op(10, 20);

    printNumberCalculator(op);

    return 0;
}

标签:函数,int,template,n1,NumberCalculator,模板
From: https://blog.csdn.net/yangguanghhh/article/details/136812727

相关文章

  • 【20.4】Django框架Form组件之钩子函数(Hook)
    【一】什么是钩子函数在forms组件中钩子函数(Hooks)是用来在特定事件发生时执行自定义逻辑的函数。它们提供了一种创建交互性和动态行为的方式,并可以用于处理表单的各种状态和数据。【二】常见的钩子函数【1】onInputChange当输入框的值发生变化时触发。你可以通过这个......
  • 想要快速建站,这有1200+免费网站模板请查收!
    不会前端,不知道怎么写代码,想要快速建站?不用担心,松桑给大家搜集了一个宝藏网站:HTMLrev。网站地址我放在结尾阅读原文了,想要直接访问的读者可以直接跳到结尾了。网站模板包含两大类,一类是前端三件套框架相关的,懂前端代码的可以直接下载然后自己定制化修改,包括Bootstrap、Tail......
  • 【12.0】Django框架之模板层
    【零】Django模板系统模板|Django文档|Django(djangoproject.com)【一】模板语法的传值{{}}:变量相关{%%}:逻辑相关【0】变量(1)传值在Django的模板语言中按此语法使用:{{变量名}}。当模版引擎遇到一个变量,它将计算这个变量,然后用结果替换掉它本身。变......
  • php事务删除加调用日志函数
    publicfunctionindex($id,$type,$data){$name='';$list='';if($type==1){$name='store';}elseif($type==2){$name='rider';......
  • 【SQL Server】超详细SQLServer日期转换、字符串、数学、聚合等常用函数大全(最新版)
    文章目录一、字符串函数1、获取uuid2、字符串截取3、字符串拼接4、字符串去空格5、大小写转换6、格式化数字为字符串7、字符串替换、转换8、查找与定位9、ISNULL判空取值二、日期时间函数1、获取当前日期和时间2、提取日期部分3、DATENAME(datepart,date_expr)函数,返......
  • 【前端素材】推荐优质综合购物电子商城网站设计Cropium平台模板(附源码)
    一、需求分析在线电子数码商店网站是指专门销售电子产品和数码设备的网上商店。这类网站通常提供广泛的产品选择,涵盖手机、平板电脑、相机、电脑配件、智能家居设备等多种数码产品。以下是在线电子数码商店网站的一般功能:产品展示与购买: 网站上展示各种电子数码产品的详细......
  • C++看程序写结果:调用一次Line类构造函数,执行几次Point类复制构造函数?
    C++看程序写结果:调用一次Line类构造函数,执行几次Point类复制构造函数?#include<iostream>#include<cmath>usingnamespacestd;classPoint{//Point类定义public:Point(intxx=0,intyy=0){x=xx;y=yy;}Point(Point&p);......
  • JavaScript学习笔记4: 流程控制语句 ,函数
    流程控制语句与java基本一致的语法<script>vara=true;if(a){    //语句}else{    //语句}</script>函数函数定义方式1<script>functionadd(a,b){returna+b;}alert(add(1,2));//也可以用变量......
  • 已知有三盏灯,LED_1,LED_2,LED_3,每盏灯有两种状态LED_ON,LED_OFF,现有两个函数void init
      #include<stdio.h>#include<string.h>#include<stdlib.h>typedefenum  {    LED_1,    LED_2,    LED_3,  }LED;typedefenum{  LED_ON,  LED_OFF,}LED_CON;voidinit(LEDL){  switch(L)  { ......
  • Python 递归函数实现二分法,带思路解释
            二分法可以大大提升对有序数列的查找,传统的迭代查找会挨个比较数列中的值,如果数列较为庞大会影响查询效率。二分法每次取数列的中间数与待查找数字比较大小,以升序排列为例子 首先要考虑数列长度的奇偶性。        奇数取中间位置的数字,如果比待查找......