1. //类模版语法
  2. #include<iostream>
  3. using namespace std;
  4.  
  5. /*
  6. 类模板和函数模板深入理解
  7. 1.编译器并不是把函数模板处理成能处理任何类型的函数
  8. 2.编译器从函数模板通过具体类型产生不同的函数
  9. 3.编译器会对函数模板进行两次编译
  10. 4.在声明的地方对模板代码进行编译
  11. 5.在调用的地方对参数替换后的代码进行编译
  12.  
  13. 对于类模板原理也是相同
  14. 强调2点:
  15. ①类模版或者函数模板是c++编译器根据调用对象的类型参数生成对应的类或者函数
  16. 也就是说不同的类型参数会产生不同的类和函数
  17. ②类模板或者函数模板会进行2次编译
  18. */
  19.  
  20. //模板声明---类中的属性参数化
  21. template<typename T>
  22. class Rectangle {
  23. public:
  24. Rectangle(T a,T b){
  25. this->weight = a;
  26. this->height = b;
  27. }
  28. T GetW(){
  29. return this->weight;
  30. }
  31. void SetA(T a);
  32. Rectangle GetSelf();
  33. private:
  34. T weight;
  35. T height;
  36. };
  37.  
  38. //在类外面实现类中的成员函数
  39. template<typename T>//模板声明
  40. void Rectangle<T>::SetA(T a){
  41. this->weight = a;
  42. }
  43.  
  44. //类模板对象做参数也必须加上参数列表
  45. template<typename T>
  46. void PrintA(Rectangle<T> a){
  47. cout << "我PrintA被调用了!" << endl;
  48. }
  49.  
  50. /*
  51. template<typename T>
  52. Rectangle Rectangle<T>::GetSelf(){
  53. return *this;
  54. }
  55. 报错: error C2244 : “Rectangle<T>::GetSelf” : 无法将函数定义与现有的声明匹配
  56. */
  57.  
  58. template<typename T>
  59. Rectangle<T> Rectangle<T>::GetSelf(){
  60. return *this;
  61. }
  62.  
  63. void PrintB(Rectangle<int> a){
  64. cout << "我PrintB被调用了!" << endl;
  65. }
  66.  
  67. //类模板的继承
  68. template<typename T>
  69. class Square :public Rectangle<T>{
  70. public:
  71. Square(T a) :Rectangle<T>(a, a){}
  72. };
  73.  
  74. class Square2 :public Rectangle<int>{
  75. public:
  76. Square2(int a) :Rectangle<int>(a, a){}
  77. };
  78.  
  79. /*
  80. 结论:类模板实现了对数据类型的抽象化,导致c++编译器无法无法确定类对象的大小,
  81. 所以在任何地方使用类模板,要么加上模板声明,要是具体化类模板
  82. 对于类模板而言 有具体的参数列表才是一个真正的类
  83. Rectangle,c++编译器不认为他是一个类
  84. Rectangle<int> ,c++编译器认为他是一个类
  85. */
  86.  
  87. void ProtectA(){
  88. //Rectangle r1;
  89. //报错 error C2955: “Rectangle”: 使用 类 模板 需要 模板 参数列表
  90. /*
  91. 本质上的原因是:类本身是一个对象的抽象,声明类的时候并不会分配内存(只有定义对象的时候才会)
  92. 类模板又是在类的基础上进一步对数据类型进行抽象化
  93. c++编译器无法确定一个类对象的大小
  94. */
  95. Rectangle<int> r2(, );
  96. /*
  97. 类模板定义对象时,必须加类型参数列表,不然无法确定对象大小
  98. */
  99. PrintA(r2);
  100. PrintB(r2);
  101. }
  102.  
  103. void ProtectB(){
  104. Square<int> sq1();
  105. Square2 sq();
  106. }
  107.  
  108. void main(){
  109.  
  110. system("pause");
  111. }

C++ 类模板一(类模板的定义)的更多相关文章

  1. singleton 类模板限制类只能定义一个对象

    singleton 类模板限制类只能定义一个对象 singleton 类模板限制类只能定义一个对象 singleton 类模板限制类只能定义一个对象 ???

  2. [Reprint] C++函数模板与类模板实例解析

    这篇文章主要介绍了C++函数模板与类模板,需要的朋友可以参考下   本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程( ...

  3. PHP模板解析类实例

    作者:mckee 这篇文章主要介绍了PHP模板解析类,涉及php针对模板文件的解析与字符串处理的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 <?php class template { ...

  4. C++_进阶之函数模板_类模板

     C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...

  5. 学习C++模板,类模板

    当我们使用向量时,会经常使用形如:vector<int> a的式子.这个表达式就是一个类模板实例化的例子,vector是一个类模板,我们给他传递模板参数(见<>里),然后创建一 ...

  6. Django框架的使用教程--类视图-中间间-模板[六]

    类视图 类视图的使用 视图函数 class class_view(View): """类视图""" def get(self, reques ...

  7. C++复习:函数模板和类模板

    前言 C++提供了函数模板(function template).所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表.这个通用函数就称为函数模板.凡是函数体 ...

  8. 【校招面试 之 C/C++】第2题 函数模板、类模板、特化、偏特化

    1.C++模板 说到C++模板特化与偏特化,就不得不简要的先说说C++中的模板.我们都知道,强类型的程序设计迫使我们为逻辑结构相同而具体数据类型不同的对象编写模式一致的代码,而无法抽取其中的共性,这样 ...

  9. C++解析(26):函数模板与类模板

    0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1. ...

  10. C++学习之函数模板与类模板

    泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思.泛型编程最初诞生于C++中,目的是为了实现C++ ...

随机推荐

  1. 在weblogic上配置数据源

    转自:http://blog.csdn.net/weijie_search/article/details/2756585 旁白 这是在weblogic9.0+mysql5.1的环境下配置的数据源.其 ...

  2. Python代码可视化

    把以下代码贴到这个网站: http://www.pythontutor.com l1 = [3, [66, 55, 44], (7, 8, 9)] l2 = list(l1) l1.append(10 ...

  3. Linux中查看jdk安装目录、Linux卸载jdk、rpm命令、rm命令参数

    一.查看jdk安装目录 [root@node001 ~]# whereis java java: /usr/bin/java /usr/local/java #java执行路径 [root@node0 ...

  4. Android 解决qq分享后返回程序出现的Bug

    问题:当我们使用qq分享时,分享成功后选择留在qq,这个时候按home键,回到手机主界面,在点击回到我的app,这个时候会出现界面显示出来了,但是任何事件都不响应,即按钮没反应. 分析:这个时候回到我 ...

  5. webDriver API——第8部分Utilities

    The Utils methods. selenium.webdriver.common.utils.free_port() Determines a free port using sockets. ...

  6. vi语法高亮,自动缩进(转)

    编辑.vimrc 这样文件在其中加入如下两行就可以了,此法对#号提示符下的操作无效. let &termencoding=&encodingset fileencodings=utf- ...

  7. Visual studio之C# 重新定义Messbox的显示窗口位置

    背景 当前做的APP需要新建一个设置窗口,该设置窗口会出现在靠近屏幕边缘位置,但主窗口铺满屏幕,设置窗口会弹出一些讯息,但默认情况下Messagebox窗口会居中于主窗口,这不太符合要求,正常应该居中 ...

  8. iOS 九宫格手势密码

    代码地址如下:http://www.demodashi.com/demo/11490.html 一.准备工作 需要准备什么环境 xcode,iOS8+ 本例子实现什么功能 主要实现手势密码设置,验证 ...

  9. 刻录车载CD音乐光盘的历程

    1.买盘 车载CD播放器不支持读可重复擦写的光盘,所以买了sony的DVD+R 4.7G(它是用来存储数据和视频的),买错了,刻了车载CD播放器也不能播放(苦笑脸#).之后又买CD+R. 2.下载歌曲 ...

  10. 关于ie,火狐,谷歌浏览器滚动条的隐藏以及自定义样式

    最近做了一个项目,要求各个浏览器统一滚动条的样式,不显示滚动条,但是不影响鼠标的滑动事件. 查了很多资料,ie和谷歌都是可以自定义滚动条样式的,但是ie只能改变颜色,并不能修改宽度,圆角之类的.谷歌就 ...