游戏开发之C++模板(C++基础)

1.C++中,模板 == 泛型。
2.模板意味预制体,属于多态中的静态动态(编译时多态)。
3.模板,编译器在编译的时候会生成真正的代码。

1.函数模板

语法:

template<class 模板名称> 或者 template<typename 模板名称>
数据类型 函数名(模板名称,模板名称,模板名称...){函数体}

1.1 函数的形参是模板

 #include <iostream>//取消std命名空间内部分成员的命名空间using std::cout;using std::endl;//T 数据类型 由外部传入template<typename T>void func(T t){//C++11 typeid(t).name() 获取当前变量的数据类型,该特性仅仅在vs中支持,并未全面编译器支持。cout << typeid(t).name() << endl;}//以上代码在编译器编译的时候根据传入的数据类型自动替换为以下代码,例如传入int型。/*void func(int t){cout << typeid(t).name() << endl;}*///交换2个变量的值template<class T>void Swap(T& t1, T& t2){T t = t1;t1 = t2;t2 = t;}int main(){//模板函数的访问方式//函数名<数据类型>(实参列表)func(1);//缺省值、默认值。取当前数据类型,不建议使用func<float>(1);func<double>(1);func<char>(1);int a, b;a = 10;b = 20;//模板可以自动识别类型,仅仅只有模板函数的形参为模板的时候Swap(a, b);float a1, b1;a1 = 10;b1 = 20;Swap(a1, b1);return 0;}

1.2 函数的返回值和形参都是模板

 #include <iostream>//取消std命名空间内部分成员的命名空间using std::cout;using std::endl;template<class T>T Func1(){return 1;}template<typename T>T Func1(T t){return 1;}template<typename T1>void Func2(T1 t1, T1 t2){}int main(){//当模板函数的返回值也是模板的时候,访问模板函数的时候必须指定数据类型Func1<int>();Func1(1);Func1(1.0f);Func2(1, 2);//Fun2(1, 1.9); 无法区分需要使用哪个数据类型进行替换,即必须手动指定Func2<int>(1, 1.9);return 0;}

1.3 函数的返回值和形参模板不是相同的类型

 template <class T1, class T2>T2 add(T1 a, T1 b){return a + b;}int main(){int a = 0;a = add<int, int>(1, 2); // 调用方式1 a = add<int, float>(1, 2); // 调用方式2return 0;}

1.4 函数的形参是多个类型的模板

 template <class T1, class T2, class T3>T3 add(T1 a, T2 b){return a + b;}int main(){int a = 0;a = add<float,int,float>(1, 2);  // 必须写明所有数据类型 return 0;}

2.类模板

TIPS:模板的声明和定义必须在一个文件里面,即hpp文件。

语法:

template <class 模板数据类型> 或者 template<typename 模板类型>
class 类名
{public:模板数据类型 变量名;模板数据类型 GetNumber() { return 变量名; }void SetNumber(模板数据类型 变量名_) { 变量名 = 变量名_; }
};类模板的定义
类名<数据类型> 变量名;

2.1 类中的成员变量和成员函数模板

 template<typename T>class A{public:T a;T* pArr;A(){pArr = new T[10];}T GetA() { return a; }};int main(){A<int> a;A<int*> a1;a.a = 300;a.GetA();a.pArr[0] = 1;return 0;}

2.2 类中的函数模板

 //类中的模板函数class B{public:template<class T>void GetA(T t) {}};//类模板和类中的函数模板的模板名称不要重名template<class T>class A1{public:template<class T1>void GetA(T1 t) {}};int main(){//类中的模板函数的访问方式B b1;b1.GetA<int>(10);//类模板和类中的模板函数访问方式A1<int> a2;a2.GetA<float>(1);return 0;}

2.3 类模板的特殊用法(用类模板中的子类定义变量名)

#include <iostream>
using std::cout;
using std::endl;
using std::cin;class C
{public:class D{public:D(){cout << __FUNCTION__ << endl;}};
};class C1
{public:class D{public:D(){cout << __FUNCTION__ << endl;}};
};template<class T>
class F
{public://typename是告知编译器,在T数据类型内一定有一个叫D的数据类型存在,可正常通过C++编译器的安全检测typedef typename T::D D1;//这样的形式可以看成T类中的D迭代器,可用于遍历迭代器。D1 d;F(){}
};int main()
{//类模板的妙用访问方式F<C> f;F<C1> f2;return 0;
}

运行结果:

游戏开发之初识C++模板(C++基础)相关推荐

  1. 七巧板平台html5游戏开发之初识物理引擎

    七巧板平台html5游戏开发之初识物理引擎 七巧板平台是用于Web App.中轻度HTML5游戏及富媒体类应用开发,集开发.运营于一体的平台.它基于HTML5技术开发,具有进入门槛极低.开发极简单.跨 ...

  2. DX11 游戏开发笔记 (二) DX11 基础框架 上

    必须吐槽csdn的排版,真的是对不起它的名字! 抱了很大的决心,才决定写下这篇博文,笔者大三从其它专业转行,学习c c++也就一年多,因为入了游戏这坑, 故选择在游戏引擎这块泥泞的道路上前进,且行且开 ...

  3. WP7平衡球游戏开发教程--初识XNA Faeseer Magic

    小时候,我就想要自己做游戏,今天的技术已经发展得如此便利,我们可以很容易地创建简单的游戏.本文试图建立一个可重用的基于组件的游戏框架,减少了我们建立基于物理引擎的XNA游戏所需的时间. 我认为我们应该 ...

  4. 【Java 2D游戏开发(一)】GUI基础 / 显示出一个窗口

    显示窗口 游戏里所有的绘制操作都要在窗口的基础上进行,可以用JFrame来新建一个窗口 JFrame window = new JFrame();//新建窗口 window.setVisible(tr ...

  5. 【HTML5 Canvas游戏开发】笔记(一) 概述和基础讲解

    本系列文章由Shin-Knight编写,转载需注明出处. 作者:Shin-Knight 邮箱:shinknight@163.com 文章链接:http://www.cnblogs.com/knight ...

  6. DX11 游戏开发笔记 (二) DX11 基础框架三角形 下

                             顶点缓存之几何三角 老鸟:怎么样,昨天游戏玩的开心吗,有没有秀出你快乐刀妹的操作. 小白:哇,那当然的,最开心的一把我现在还记忆犹新,我们前期劣势,有 ...

  7. Laya Air游戏开发模式之传统MVC模式(基础篇)

    没错这次要介绍的开发模式就是开发界中的万油精

  8. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  9. unity 3d游戏开发_使用Unity 5开发3D游戏

    unity 3d游戏开发 If there's one thing cooler than playing games, it's building games. 如果有比玩游戏更酷的一件事,那就是构 ...

  10. Android+3D游戏开发技术详解与典型案例

    内容导读 本书共分两篇,第一篇介绍了Android 3D游戏开发的基础知识,主要对OpenGL ES的相关内容进行了介绍. 章 名主 要 内 容 第1章 英雄还看今朝-Android简介本章介绍了市场 ...

最新文章

  1. linux下监控用户的操作记录
  2. Symfony2插件StofDoctrineExtensionsBundle的使用说明
  3. 【渝粤题库】广东开放大学 学前教育学 形成性考核
  4. 使用jQuery异步传递含复杂属性及集合属性的Model到控制器方法
  5. hdu1202解题报告
  6. KMP算法 --- 在文本中寻找目标字符串
  7. 万恶的WIN10,已有的VirftualBox虚拟机都不能用了
  8. Atitit 项目风险管理 目录 1. 技术分险 2 1.1. 全面跟随大公司解决方案 2 1.2. 过度设计 2 1.3. 可读性 扩展性不足 2 1.4. 教条僵化 2 1.5. 技术方案超出了
  9. python random库 伪随机 随机抽数字 抽学号
  10. win10+android+手机驱动,win10系统电脑没有手机驱动的解决方法
  11. Tecplot 360 安装后弹出“Is your Tecplot 360 EX liense valid?”解决方法
  12. 科学家做一个实验,我就得胖三斤?
  13. 服务器数码管不显示,数码管常见故障及检修方法
  14. 未过GMS认证和CTS测试的ODM厂商如何使用google play
  15. 国家司法考试真题模拟APP
  16. Lisa随手记 1.7 帮助
  17. IO流的详解,彻底了解IO流
  18. 有哪些公司为外贸独立站提供收款服务?
  19. 再读新疆系列(九)——归意切切
  20. enum 泛型 java_Java Enum作为Enum中的泛型类型

热门文章

  1. LeetCode—2.堆排序算法
  2. 图论算法——无向图的连通分量
  3. 容器使用的12条军规——《Effective+STL中文版》试读
  4. 意境级讲解二分查找算法、python
  5. 有趣的算法(七):3分钟看懂希尔排序(C语言实现)
  6. 编译异常例子java_Java中异常发生时代码执行流程
  7. jersey tomcat MySQL_IDEA+Jersey+Tomcat搭建RESTful API
  8. java string 日期格式_Java 日期格式和String 转换
  9. oracle gi 创建,浅谈Oracle RAC --GI的启动
  10. React Native 介绍