C++面向对象编程<十三>:template和reference
2016-02-25 21:03
429 查看
class template 、function template以及member template;
class template 和 function template前面的文章讲过
语法如下
![](https://img-blog.csdn.net/20160225201810340)
class就是个模板,而成员里还有个模板。T1、T2可以变化,U1、U2也可以变化。
见下面栗子(还是图比较清楚能描述意思)
![](https://img-blog.csdn.net/20160225202020137)
再看个例子(智能指针)
![](https://img-blog.csdn.net/20160225202123419)
指针是指向下面的,这是合理的,如有个指向动物的指针,你让它指向猪、猫都行。既然指针可以,智能指针也必须可以。
解释:上面的是泛化,下面的是特化。且下面的都对()进行重载。
![](https://img-blog.csdn.net/20160225202423300)
偏特化:个数上的偏,范围上的偏。
如下图,个数上的偏特化。一定要从左边到右边,不能跳着来
![](https://img-blog.csdn.net/20160225202524317)
范围上的偏特化,如下,T是任意类型,现在把它范围缩小成指针,如下
![](https://img-blog.csdn.net/20160225202605984)
指定一个容器,一个容器元素的类型,很有弹性。
![](https://img-blog.csdn.net/20160225202834844)
![](https://img-blog.csdn.net/20160225203105939)
怎么学习?统统去试一遍!!!
从内存角度上看。
下面看程序
reference的常见用途
reference就是一种漂亮的pointer,reference通常不用于声明变量,而用于参数类型和返回类型的描述。
以下被视为“same signature”(所以二者不能同时存在)
class template 和 function template前面的文章讲过
member template
在标准库很多构造函数会出现。语法如下
class就是个模板,而成员里还有个模板。T1、T2可以变化,U1、U2也可以变化。
见下面栗子(还是图比较清楚能描述意思)
再看个例子(智能指针)
指针是指向下面的,这是合理的,如有个指向动物的指针,你让它指向猪、猫都行。既然指针可以,智能指针也必须可以。
specialization,模板特化
泛化就是模板,特化的意思就是指你作为一个设计者,你可能要面对一些特殊的类型要单独处理。解释:上面的是泛化,下面的是特化。且下面的都对()进行重载。
partial specialization,模板偏特化
泛化又分为:全泛化(full specialization)和(partial specialization,模板偏特化(局部特化))偏特化:个数上的偏,范围上的偏。
如下图,个数上的偏特化。一定要从左边到右边,不能跳着来
范围上的偏特化,如下,T是任意类型,现在把它范围缩小成指针,如下
template template parameter,模板模板参数
见下图指定一个容器,一个容器元素的类型,很有弹性。
关于C++标准库
一句话:标准库很重要!!!主要部分见下图怎么学习?统统去试一遍!!!
reference
变量有三种:pointer , self , reference。从内存角度上看。
下面看程序
#include <iostream> using namespace std; typedef struct Stag { int a; int b; int c; int d; }S; int main(void) { double x = 0; double *p = &x; double &r = x; cout << sizeof(x) << endl; //8 cout << sizeof(p) << endl; //4(32位),8(64位) cout << sizeof(r) << endl; //0X9ffe30 cout << p << endl; //0 cout << *p << endl; //0 cout << x << endl; //0 cout << r << endl; //0X9ffe30 cout << &x << endl; //0X9ffe30 cout << &r << endl; //0X9ffe30 S s; S& rs = s; cout << sizeof(s) << endl; //16 cout << sizeof(rs) << endl; //16 cout << &s << endl; //0X9ffe20 cout << &rs << endl; //0X9ffe20 return 0; }
reference的常见用途
reference就是一种漂亮的pointer,reference通常不用于声明变量,而用于参数类型和返回类型的描述。
以下被视为“same signature”(所以二者不能同时存在)
double imag(const double& im) { ... } double imag(const double im) { ... } // ambiguity
相关文章推荐
- 前端工程之模块化
- JSON.parse()和JSON.stringify()
- 前端模块化
- 160223、jquery中attr和prop的区别
- 35个 jQuery 小技巧/代码片段
- JavaScript学习笔记(3)——JavaScript与HTML的组合方式
- 彻底解决_OBJC_CLASS_$_某文件名", referenced from:问题
- 网页div转换成图片导出——html2canvas
- jsp 基础知识
- CSS属性选择器
- HTML+CSS 整站 步骤
- 35个 jQuery 小技巧
- SetInterval()与setTimeout()的区别
- Chapter 4、流程控制(二)---循环语句 (25th,Feb)
- 汉语拼音工具包相关实用方法
- gulp前端自动化构建工具新手入门篇
- json-c库例子
- 使用Jquery获取页面中只有name下的第二个子元素
- html5全解析
- html5全解析