C++学习-模板
来源:互联网 发布:c 接ctp的源码示例 编辑:程序博客网 时间:2024/05/29 12:56
模板:把数据类型当作一种未知量(形参的形式)来处理
模板声明:template<class T1,....> ....
1.函数模板
//STL 标准模板类库#include <iostream>#include <string>using namespace std;//为什么有模板:整合template <typename T>T sum(T a, T b){return a + b;}int main(){//模板实例化--->模板的使用//1.隐式调用int a = 1;int b = 2;cout << sum(a, b) << endl;//2.显示调用(显示实例化)函数<类型>(实参)cout << sum<double>(1.11, 2.11) << endl;system("pause");return 0;}
2.类模板
#include <iostream>using namespace std;template <typename T>class C{public:C(T x, T y) :m_x(x), m_y(y){}T Max()const{return m_x > m_y ? m_x : m_y;}T Min()const;private:T m_x;T m_y;};template <typename T>T C<T>::Min()const{return m_x > m_y ? m_y : m_x;}//父类是模板类,继承后的子类一定是模板类template <typename T>class B :public C<T>{public:private:};int main(){double x = 1.11, y = 1.22;//类模板必须要显式实例化//类名<类型>对象C<double> c(x, y);cout << c.Max() << endl;system("pause");return 0;}
3.模板的特化
#include<iostream>using namespace std;template <typename A ,typename B>class Ez{public:static void show(){cout << "Ez(A,B)" << endl;}};//完全特化template <>class Ez<int ,double>{public:static void show(){cout << "Ez(int,double)" << endl;}};//局部特化template <typename T>class Ez<T,T>{public:static void show(){cout << "Ez(T,T)" << endl;}};template <typename T>class Ez<T*, T*>{public:static void show(){cout << "Ez(T*,T*)" << endl;}};int main(){//静态成员函数不需要对象就可以使用Ez<int, double>::show();Ez<int, int>::show();Ez<int *, int *>::show();return 0;}
4.模板的重载
#include <iostream>using namespace std;//int const* p和 const int *p==没区别//int const *p int * const p;template <typename T>T const& Max(T const& x, T const& y){cout << 1 << endl;return x > y ? x : y;}template <typename T>//T * :返回值类型T* x, T* yT* const& Max(T* const& x, T* const& y){cout << 2 << endl;return *x > *y ? x : y;}int Max(int a, int b){cout << 3 << endl;return a > b ? a : b;}int main(){int a = 123, b = 134;cout << Max(a ,b) << endl;//模板与普通函数的重载:优先调用普通函数 实参和普通函数的类型一致int *p = &a, *q = &b;//模板和模板的重载:满足重载的要求 ,调用先调用满足匹配的模板cout << *Max(p, q) << endl;system("pause");return 0;}
5.模板类的继承
//模板类,必须显式实例化//模板类: 类存在未知类型#include <iostream>#include <string>using namespace std;template<typename T>class Any{public:Any(T x, T y) :x(x), y(y){}T Max() const{return x > y ? x : y;}T Min()const;protected:T x;T y;};//类外实现 :模板类,他不是一个完整的类型,所以你在使用过程要加上类型说明:<类型>template <typename T> T Any<T>::Min() const{return x > y ? y : x;}template <typename T>class thing :public Any<T>{public:protected:};template <typename T>class StaticData{public:protected:T day;static int s_data;};template <typename T>int StaticData<T>::s_data = 1;int main(){//类模板的实例化Any<string> object("abc","acd");cout<<object.Max()<<endl;cout << object.Min() << endl;system("pause");return 0;}
6.模板中的静态成员
#include <iostream>using namespace std;class A{public:A(int data):m_data(data){}int m_data;static int s_data;};int A::s_data = 10;template <typename T>class B{public:B(int data) :m_data(data){}int m_data;static int s_data;};template <typename T>int B<T>::s_data = 100;int main(){return 0;}
7.自定义类型当作模板参数实例化
#include<iostream>using namespace std;template <typename T>class Data{public:Data(T a, T b) :x(a), y(b){}T& getx(){return x;}T& gety(){return y;}protected:T x;T y;};template <typename E >//比较的是对象类型E &Max(E &a, E &b){return a.getx() > b.getx() ? a : b;}int main(){Data<int> myData(1, 2);Data<int> myData2(2, 3);//自定义类型的实例化//返回的是一个对象 //对象的不能够直接输出 ----输出成员cout <<"x="<<Max<Data<int>>(myData,myData2).getx() << endl;Max<Data<int>>(myData, myData2).gety() = 6;cout << "y=" << Max<Data<int>>(myData, myData2).gety() << endl;system("pause");return 0;}
阅读全文
0 0
- C++template ;模板学习
- 学习C++模板---模板函数
- C/C++学习之模板
- 学习C++模板---模板类带简单参数
- 学习C++模板---模板类作为基类
- C++primer学习:模板编程(2):类模板的定义
- C++primer学习:模板编成(5):模板实参推断{1}
- C++primer学习:类模板(2)类模板:模板参数,成员模板和控制实例化
- C++Template学习笔记之函数模板
- C/C++学习----第五章 模板
- C++模板 学习要点
- (C/C++学习笔记)函数模板加强
- C++primer学习:模板编程(4)
- C++Primer学习:模板特例化
- STL模板学习之set容器(C/C++)
- 学习C++模板---模板类带简单参数,并且添加缺省参数,特例模板
- C++primer学习:类模板(1):函数模板,模板参数,实例化
- C++-模板
- Java基础数组总结
- SSH04---分页
- jn-观展聆听合并,学艺术合并
- flex布局2
- 关于用delete方法删除不掉文件
- C++学习-模板
- IT 行业加班,到底有没有价值?
- getline()的定义及应用
- redis sorted set跳跃表的实现
- 【LeetCode】283. Move Zeroes
- guava的String之Splitter
- 线性表
- G
- Java值传递和引用传递