码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 3.5 C++高级编程_类模板


    对于代码相似的函数,我们可以使用函数模板。

    类似的,对于那些代码相似的类,我们也可以使用类模板。

    类模板

    修改代码,首先声明一个类模板AAA。

    1. template<typename T>
    2. class AAA {
    3. private:
    4. T t;
    5. public:
    6. void test_func(const T &t);
    7. void print(void);
    8. };

    这个类模板中有一个私有成员t,它的数据类型由传入的模板参数T决定。

    还有两个公有的成员函数test_func和print。

    分别实现这两个函数。

    test_func函数

    设置私有成员t的值。

    1. template
    2. void AAA::test_func(const T &t)
    3. {
    4. this->t = t;
    5. }

    print函数

    输出私有成员t的值。

    1. template
    2. void AAA::print(void)
    3. {
    4. cout << this->t << endl;
    5. }

    在main函数中分别定义两个类,T分别是int和double。

    main函数

    1. int main(int argc, char **argv)
    2. {
    3. AAA<int> a;
    4. a.test_func(1);
    5. a.print();
    6. AAA<double> b;
    7. b.test_func(1.23);
    8. b.print();
    9. return 0;
    10. }

    编译测试,可以看到使用了AAA模板成功创建了两个对象。

    使用类模板

    类模板的使用可以分为两种:

    1. 用到时再实例化;
    2. 事先实例化;

    上面的测试代码,使用的就是用到时再实例化。

    在main函数中,只有使用 AAA a 语句的时候,编译器才通过类模板,创建了a对象;对于a对象的成员函数,编译器只有在使用到的时候,才会去创建对应的函数。

    也可以在使用前,事先实例化。

    即先使用:

    template AAA<int>;
    

    再使用:

    AAA<int> a;

    (事先实例化部分存疑,可能是我的理解有误,在代码中添加 template AAA; 编译会报错)

    重载/定做类模板

    C++可以重载函数,类似的,也可以重载类模板,也叫作定做类模板。

    修改代码,重载类模板AAA。

    注意只是重载了T为int时的类模板,T为其他类型时模板还是会使用原来的AAA。

    1. template <>
    2. class AAA<int> {
    3. public:
    4. void test_func_int(const int & t)
    5. {
    6. cout << t << endl;
    7. }
    8. void print_int(void);
    9. };
    10. void AAA<int>::print_int(void)
    11. {
    12. cout << "for test" << endl;
    13. }

    main函数

    1. int main(int argc, char **argv)
    2. {
    3. AAA<int> a;
    4. a.test_func_int(1);
    5. a.print_int();
    6. AAA<double> b;
    7. b.test_func(1.23);
    8. b.print();
    9. return 0;
    10. }

    编译测试如下,可以看到T为int时,重载了类模板AAA,T为double时,没有影响。

     

     

  • 相关阅读:
    Offsets 获取该行的起始索引 start=offsets (x)
    企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图
    对强缓存和协商缓存的理解
    使用modinfo对比内核版本号
    【无标题】
    项目:后台管理系统的开发及自动化部署
    【C语言】【牛客刷题】【BC115】 小乐乐与欧几里得
    【数据结构】堆的拓展延伸 —— 堆排序 和 TopK问题
    [漏洞分析] CVE-2023-38545 curl“史上最严重的漏洞“分析
    禁止EditView自动弹出系统软键盘_Android基础篇(Java)
  • 原文地址:https://blog.csdn.net/qq_33141353/article/details/126330776
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号