IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++函数模板和类模板C++的泛型 -> 正文阅读

[C++知识库]c++函数模板和类模板C++的泛型


c++用模板实现泛型,关键字是 template 相当于其他语言的泛型

函数模板

模板当调用的时候要给出明确类型,然后编译器根据类型生成多个不同的函数定义,例如调用了3次,不同的3个类型,那么编译器就在汇编的时候call了3个不同的函数地址,都是不同的类型函数定义
格式 template
或者 template
typename 和 class 可以互换,完全等价

template <typename T>
template <class T>

多个不同的类型,要单独为每个类型设置一个 typename,如下:

template <typename T1,typename T2>//每个类型单独用typename 修饰类型
void show(T1 a,T2 b)

代码示例

using namespace::std;
template <typename T>
T add(T a, T b){
      return a + b;
}
/*
 多参数模板
 */
template <typename T1,typename T2>//每个类型单独用typename 修饰类型
void show(T1 a,T2 b){
      cout << a <<endl <<b<<endl;
}
class Person{
public:
      int age = 0;
      Person(int a):age(a){}
      Person operator + (Person & person){ //重载了+ ,供 add函数使用
            return Person(this->age + person.age);
      }
};
int main(int argc, const char * argv[]) {
      /*
       模板的调用的时候,完整调用要加上<类型>,给出明确类型,但是如果,类型在括号里能自动识别出来,就不需要加<类型>
       */
      cout<< add<int>(1,2)<<endl;
      cout << add(3,4)<<endl;//类型刚好在()里面自动能识别出来是int类型
      cout << add(3.11,4.11)<<endl;//类型自动识别成 float类型
      cout << sub(1,2)<<endl;
      Person a = Person(3);
      Person b = Person(10);
      cout << add(a,b).age <<endl; //add传入自定义的类对象,需要在类里面有可以被调用的操作符,重载+,因为add里面重载了 + 加号
      show(3, 3.14);
      show("abc", 789);
}

类模板

  • 类模板跟函数模板一样,只是放在类的开头
  • 类外定义函数,如果函数包括泛型,需要写template 和类型,并且在类名后面添加泛型类型 ,例如:
template <typename T>
void Person<T>::setAge(T age)

代码示例

template <typename T>
class Person{
    T age;
public:
    
    friend ostream &operator  << (ostream &cout,Person<T> & person);
      Person(T a):age(a){}
      Person operator + (Person & person){ //重载了+ ,供 add函数使用
            return Person(this->age + person.age);
      }
    void setAge(T age);
};

//类外定义函数,如果函数包括泛型,需要写template <typename T> ,并且在类名后面添加<T>::
template <typename T>
void Person<T>::setAge(T age){
    age = age;
    cout << "setAge() = "<< age <<endl;
}

template <typename T>
ostream &operator  << (ostream &cout,Person<T> & person){//xcode下写 <<就行 但是在VS.net平台下, 要把 <<写成 <<<> ostream &operator  <<<> (ostream &cout,Person<T> & person){
    cout <<"age = " << person.age;
    return cout;
}
int main(int argc, const char * argv[]) {
    Person<int> a = Person<int>(3); //创建对象的时候要给出泛型的明确类型
    Person<int> b = Person<int>(10);
    a = a + b;
    Person<int> c = a+b;//调用重载的+运算符
    cout << c <<endl; //调用重载的 << 运算符
    a.setAge(33);
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-15 11:36:23  更:2021-10-15 11:38:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:31:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码