0717学习总结(c++模板)
来源:互联网 发布:资本在线网络贷款 编辑:程序博客网 时间:2024/06/11 22:51
1.c++模板
1.模版是实现代码的一种工具,可以实现参数类型化,就是把参数定义为类型,从而实现代码的可重用性。
2.模版分为类模版和函数模版。模版就是把功能相似,仅数据类型不同的函数和类设计为通用的函数模版和类模版,提供给用户。
3.模版是泛型编程基础。所谓泛型编程就是独立于任何特定类型的方式编写代码。
4.简单说:类是对象的抽象,模版是类的抽象,用模版定义具体类。
2.函数模版的语法:
Template <class /typename T1, class /typename T2 >
返回类型 函数名(函数形参表)
{
函数定义体
}
例:
Template <typename T,typename T2> T max1(T a, T2 b)
{ return a > b?a:b;}
3.类模版:
Template <class T>
class 类名
{
//类定义
};
类模板中,成员函数不能被声明为虚函数。类模版不能和另外一个实体的名称相同
4.函数模版
为了交换不同类型的变量的值,我们通过函数重载定义了四个名字相同、参数列表不同的函数,如下所示:
void Swap(int *a, int *b) //交换 int 变量的值
{ int temp = *a; *a = *b; *b = temp; }
void Swap(float *a, float *b) //交换 float 变量的值
{ float temp = *a; *a = *b; *b = temp; }
void Swap(char *a, char *b) //交换 char 变量的值
{ char temp = *a; *a = *b; *b = temp; }
void Swap(bool *a, bool *b) //交换 bool 变量的值
{ char temp = *a; *a = *b; *b = temp; }
5.Template <typename T> void Swap(T *a, T *b)
{
T temp = *a;
*a = *b;
*b = temp;
}
1.template是定义函数模板的关键字,它后面紧跟尖括号<>,尖括号包围的是类型参数(也可以说是虚拟的类型,或者说是类型占位符)。
2.typename是另外一个关键字,用来声明具体的类型参数,这里的类型参数就是T。
3.template<typename T>被称为模板头。
6.所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,
而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。
这个通用函数就称为函数模板(Function Template)。
7.函数模版的用法:
template < typename 类型参数1 , typename 类型参数2 , ...>
返回值类型 函数名(形参列表)
{
//在函数体中可以使用类型参数
}
typename关键字也可以使用class关键字替代,它们没有任何区别。
8.类模版
声明类模板的语法为:
template<typename 类型参数1 , typename 类型参数2 , …>
class 类名
{
//TODO:
};
类模板和函数模板都是以 template 开头(当然也可以使用 class,目前来讲它们没有任何区别),后跟类型参数;
类型参数不能为空,多个类型参数用逗号隔开。
9.类外定义成员函数时仍然需要带上模板头,格式为:
Template <typename 类型参数1 , typename 类型参数2 , …> 返回值类型 类名<类型参数1 , 类型参数2, ...>::函数名(形参列表)
{
//TODO:
}
第一行是模板头,第二行是函数头,它们可以合并到一行,
不过为了让代码格式更加清晰,一般是将它们分成两行。
10.使用类模板创建对象
使用类模板创建对象时,需要指明具体的数据类型:
Point<int, int> p1(10, 20);
Point<int, float> p2(10, 15.5);
Point<float, char*> p3(12.4, "东京180度");
除了对象变量,我们也可以使用对象指针的方式来实例化:
Point<float, float>
*p1 = new Point<float, float>(10.6, 109.3);
Point<char*, char*>
*p = new Point<char*, char*>("东京180度", "北纬210度");
11.函数模版的重载
我们定义了 Swap() 函数用来交换两个变量的值:
一种方案是使用指针,
另外一种方案是使用引用,
这两种方案都可以交换 int、float、char、bool 等基本类型变量的值;
但是却不能交换两个数组。
//方案①:使用指针:
template<typename T> void Swap(T *a, T *b)
{ T temp = *a; *a = *b; *b = temp; }
//方案②:使用引用
template<class T>
void Swap(T &a, T &b)
{ T temp = a; a = b; b = temp; }
12.函数模版的实参推演
1. 类模版
在使用类模板创建对象时,需要显式的指明实参(也就是具体的类型)。 例如对于下面的 Point 类:
template<typename T1, typename T2> class Point;
在栈上创建对象: Point<int, int> p1(10, 20);
在堆上创建对象: Point<char*, char*> *p =
new Point<char*, char*>(“东京180度”, “北纬210度”);
2.函数模板
对于函数模板,调用函数时可以不显式地指明实参
(也就是具体的类型)。请看下面的例子:
template<typename T> void Swap(T &a, T &b); //函数声明
Int n1 = 100, n2 = 200; Swap(n1, n2);
float f1 = 12.5, f2 = 56.93; Swap(f1, f2);
虽然没有显式地指明 T 的具体类型,但是编译器会根据 n1 和 n2、f1 和 f2 的类型自动推断出 T 的类型。
这种通过函数实参来确定模板实参(也就是类型参数的具体类型)的过程称为模板实参推断。
13.模板实参推断过程中的类型转换:
1.算数转换:例如 int 转换为 float,char 转换为 int,
double 转换为 int 等。
2.派生类向基类的转换:也就是向上转型,
3.const 转换:也即将非 const 类型转换为 const 类型,
例如将 char * 转换为 const char *。
4.数组或函数指针转换:如果函数形参不是引用类型,那么数组名会转换为数组指针,函数名也会转换为函数指针。
5.用户自定的类型转换。
两个函数原型:
void func1(int n, float f);
void func2(int *arr, const char *str);
它们具体的调用形式为:
int nums[5];
char *url = "http://c.biancheng.net";
func1(12.5, 45);
func2(nums, url);
1.模版是实现代码的一种工具,可以实现参数类型化,就是把参数定义为类型,从而实现代码的可重用性。
2.模版分为类模版和函数模版。模版就是把功能相似,仅数据类型不同的函数和类设计为通用的函数模版和类模版,提供给用户。
3.模版是泛型编程基础。所谓泛型编程就是独立于任何特定类型的方式编写代码。
4.简单说:类是对象的抽象,模版是类的抽象,用模版定义具体类。
2.函数模版的语法:
Template <class /typename T1, class /typename T2 >
返回类型 函数名(函数形参表)
{
函数定义体
}
例:
Template <typename T,typename T2> T max1(T a, T2 b)
{ return a > b?a:b;}
3.类模版:
Template <class T>
class 类名
{
//类定义
};
类模板中,成员函数不能被声明为虚函数。类模版不能和另外一个实体的名称相同
4.函数模版
为了交换不同类型的变量的值,我们通过函数重载定义了四个名字相同、参数列表不同的函数,如下所示:
void Swap(int *a, int *b) //交换 int 变量的值
{ int temp = *a; *a = *b; *b = temp; }
void Swap(float *a, float *b) //交换 float 变量的值
{ float temp = *a; *a = *b; *b = temp; }
void Swap(char *a, char *b) //交换 char 变量的值
{ char temp = *a; *a = *b; *b = temp; }
void Swap(bool *a, bool *b) //交换 bool 变量的值
{ char temp = *a; *a = *b; *b = temp; }
5.Template <typename T> void Swap(T *a, T *b)
{
T temp = *a;
*a = *b;
*b = temp;
}
1.template是定义函数模板的关键字,它后面紧跟尖括号<>,尖括号包围的是类型参数(也可以说是虚拟的类型,或者说是类型占位符)。
2.typename是另外一个关键字,用来声明具体的类型参数,这里的类型参数就是T。
3.template<typename T>被称为模板头。
6.所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,
而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。
这个通用函数就称为函数模板(Function Template)。
7.函数模版的用法:
template < typename 类型参数1 , typename 类型参数2 , ...>
返回值类型 函数名(形参列表)
{
//在函数体中可以使用类型参数
}
typename关键字也可以使用class关键字替代,它们没有任何区别。
8.类模版
声明类模板的语法为:
template<typename 类型参数1 , typename 类型参数2 , …>
class 类名
{
//TODO:
};
类模板和函数模板都是以 template 开头(当然也可以使用 class,目前来讲它们没有任何区别),后跟类型参数;
类型参数不能为空,多个类型参数用逗号隔开。
9.类外定义成员函数时仍然需要带上模板头,格式为:
Template <typename 类型参数1 , typename 类型参数2 , …> 返回值类型 类名<类型参数1 , 类型参数2, ...>::函数名(形参列表)
{
//TODO:
}
第一行是模板头,第二行是函数头,它们可以合并到一行,
不过为了让代码格式更加清晰,一般是将它们分成两行。
10.使用类模板创建对象
使用类模板创建对象时,需要指明具体的数据类型:
Point<int, int> p1(10, 20);
Point<int, float> p2(10, 15.5);
Point<float, char*> p3(12.4, "东京180度");
除了对象变量,我们也可以使用对象指针的方式来实例化:
Point<float, float>
*p1 = new Point<float, float>(10.6, 109.3);
Point<char*, char*>
*p = new Point<char*, char*>("东京180度", "北纬210度");
11.函数模版的重载
我们定义了 Swap() 函数用来交换两个变量的值:
一种方案是使用指针,
另外一种方案是使用引用,
这两种方案都可以交换 int、float、char、bool 等基本类型变量的值;
但是却不能交换两个数组。
//方案①:使用指针:
template<typename T> void Swap(T *a, T *b)
{ T temp = *a; *a = *b; *b = temp; }
//方案②:使用引用
template<class T>
void Swap(T &a, T &b)
{ T temp = a; a = b; b = temp; }
12.函数模版的实参推演
1. 类模版
在使用类模板创建对象时,需要显式的指明实参(也就是具体的类型)。 例如对于下面的 Point 类:
template<typename T1, typename T2> class Point;
在栈上创建对象: Point<int, int> p1(10, 20);
在堆上创建对象: Point<char*, char*> *p =
new Point<char*, char*>(“东京180度”, “北纬210度”);
2.函数模板
对于函数模板,调用函数时可以不显式地指明实参
(也就是具体的类型)。请看下面的例子:
template<typename T> void Swap(T &a, T &b); //函数声明
Int n1 = 100, n2 = 200; Swap(n1, n2);
float f1 = 12.5, f2 = 56.93; Swap(f1, f2);
虽然没有显式地指明 T 的具体类型,但是编译器会根据 n1 和 n2、f1 和 f2 的类型自动推断出 T 的类型。
这种通过函数实参来确定模板实参(也就是类型参数的具体类型)的过程称为模板实参推断。
13.模板实参推断过程中的类型转换:
1.算数转换:例如 int 转换为 float,char 转换为 int,
double 转换为 int 等。
2.派生类向基类的转换:也就是向上转型,
3.const 转换:也即将非 const 类型转换为 const 类型,
例如将 char * 转换为 const char *。
4.数组或函数指针转换:如果函数形参不是引用类型,那么数组名会转换为数组指针,函数名也会转换为函数指针。
5.用户自定的类型转换。
两个函数原型:
void func1(int n, float f);
void func2(int *arr, const char *str);
它们具体的调用形式为:
int nums[5];
char *url = "http://c.biancheng.net";
func1(12.5, 45);
func2(nums, url);
阅读全文
0 0
- 0717学习总结(c++模板)
- 【C++】模板总结
- 【C++】模板函数总结!!!
- 【c++】模板知识总结
- 学习总结: C++ 模板 (thinking in C++)
- Smarty模板学习总结
- 类模板学习总结
- C++模板学习总结
- C++template ;模板学习
- 学习C++模板---模板函数
- 字符串HASH 学习总结 && 模板
- Java Hibernate模板 学习总结
- Flask-Jinja2模板学习总结
- C/C++学习之模板
- [编程学习]C++ 函数模板学习总结
- linux c 编程模板总结(一)
- linux c 编程模板总结(二)
- C基础学习总结
- 程序员的学习和积累
- 嵌入式学习10(C语言五大内存区间,变量的作用域和生存期,变量的存储类型)
- IDEA部分快捷键 git文件过滤以及其他杂文
- 压缩多张图片,解压后发现图片文件损坏的问题解决
- POJ 1724 ROADS (DFS)
- 0717学习总结(c++模板)
- 创建数据库的时候就将数据库保存到SDcard中
- 第2节-Linux的硬盘分区格式
- 连马云都要打包带走的美食_你不来一份儿?
- ORACLE RAC 集群的启动和关闭
- dubbo java.lang.NoClassDefFoundError
- 数对之差的最大值
- 互联网应用架构师
- Why would I want to fitsSystemWindows?