C++模板

一、模板

1.1 模板的概念

模板是支持参数化多态的工具,可以让类或函数支持一种通用类型

类中的属性、成员函数的参数、函数返回值在实际使用时可以是任何数据类型

通过模板程序员就可以编写一些与类型无关的代码

模板为不同的数据类型制定了一套通用的算法

模板通常有两种形式:

  1. 函数模板
  2. 类模版

1.2 函数模板 

函数模板可以使一个函数的参数和返回值支持通用类型,使此函数专注于算法设计

函数模板针对参数类型不同的函数,参数类型不一样,但是功能与函数名称相同

#include <iostream>

using namespace std;

// 模板说明
// 用T类型作为通用类型,来设置一个模板的函数或者类
template <class T> // 正式代码中看到<>大概率使用模板
T add(T a, T b) // 可以传入任何类型
{
    return a + b; // 如果传入的参数类型不支持此计算则会报错
}

int main()
{
    cout << add(2,3) << endl; // 5
    cout << add(2.3,3.3) << endl; // 5.6
    
    string s1 = "AA";
    string s2 = "BB";
    
    cout << add(s1,s2) << endl; // AABB
    //    cout << add("AA","BB") << endl; 错误,能传进去但是不支持加法

    return 0;
}

自定义狗类(拓展)

#include <iostream>

using namespace std;

template <class T>
T add(T a, T b)
{
    return a + b;
}

class Dog
{
public:
    // 单纯让语法通过,逻辑乱写的
    friend Dog operator +(const Dog& d1, const Dog& d2);
};

Dog operator + (const Dog &d1, const Dog& d2)
{
    cout << "编译通过" << endl;
    Dog d;
    return d;
}

int main()
{
    cout << add(2,3) << endl; // 5

    string s1 = "AA";
    string s2 = "BB";
    cout << add(s1,s2) << endl; // AABB
    //    cout << add("AA","BB") << endl; 错误,能传进去但是不支持加法

    Dog d1, d2;
    add(d1, d2);

    return 0;
}

1.3 类模板

类模板可以把模板的范围扩展到一个类中

#include <iostream>

using namespace std;

template <typename T> // typename等效于class
class Test
{
private:
    T value;

public:
    Test(T value):value(value){}

    T get_value()
    {
        return value;
    }

    void set_value(T value)
    {
        this->value = value;
    }
};


int main()
{
    // 创建一个T类型为int的Test对象t
    Test<int> t1(45);
    cout << t1.get_value() << endl;

    t1.set_value(110);
    cout << t1.get_value() << endl;

    Test<double> t2(4.5);
    cout << t2.get_value() << endl;

    Test<string> t3("hahahhaha");
    cout << t3.get_value() << endl;

    return 0;
}

类内声明类外定义

#include <iostream>

using namespace std;

template <typename T> // typename等效于class
class Test
{
private:
    T value;

public:
    // 类内声明
    Test(T v);
    T get_value() const;
    void set_value(T v);
};

// 类外定义
template <typename T>
Test<T>::Test(T value):value(value){}

template <typename T>
T Test<T>::get_value() const
{
    return value;
}

template <typename T>
void Test<T>::set_value(T v)
{
    value = v;
}


int main()
{
    // 创建一个T类型为int的Test对象t
    Test<int> t1(45);
    cout << t1.get_value() << endl;

    t1.set_value(110);
    cout << t1.get_value() << endl;

    Test<double> t2(4.5);
    cout << t2.get_value() << endl;

    Test<string> t3("hahahhaha");
    cout << t3.get_value() << endl;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值