1. 类模板的默认参数规则:

#include <iostream>
using namespace std; /*
//类模板,不调用不编译(函数);变量还是规范
template<class T = int> //即使参数默认,调用的时候还是要指明类型
class myclass
{
public:
T a;
T b; T add()
{
return a + b;
} }; int main()
{
myclass<int> my;
my.a = 10;
my.b = 20;
my.add(); system("pause");
return 0;
}
*/ template<class T1, class T2 = double, class T3 = char> //默认参数,原则上都放在右边
class myclassT
{
public: }; int main()
{
myclassT<int> my1; //<>无论如何都不能省略,
//有默认参数原则上可以省略;如果中间出现一个没有省略,需输入若干参数,覆盖那个位置 system("pause");
return ;
}

 2. 类模板的嵌套:

#include <iostream>
#include <vector>
#include <list>
using namespace std; /*
//类的怀孕现象
class my
{
public:
class zi //嵌套类
{ }; zi z1;
};
*/ template<class T>
class myT
{
public:
template<class T> //嵌套类模板
class ziT
{
T a;
public:
void seta(T t)
{
a = t;
} T geta()
{
return a;
}
}; ziT<int> my1; //无论外部什么类型,始终都是int
ziT<T> my2; //外部什么类型,内部也是该类型
vector<T> myv;
list<T> myx;
}; int main()
{
myT<double> d1; system("pause");
return ;
}

3. 模板参数的嵌套:

#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std; /*
int main()
{
vector<int> myint1;
vector< vector<int> > myint2; //二维数组
vector< vector< vector<int> > > myint3; //三位数组 system("pause");
return 0;
}
*/ template<class T>
class men
{
public:
men()
{ }
~men()
{ }
T getAge()
{
return age;
}
T getName()
{
return name;
}
void setAge(T && a)
{
age = a;
}
void setName(T & n)
{
name = n;
} private:
T name;
T age; }; template<template<class T>class T1> //此时 T1 <==> men
class people
{
public:
T1<int> s1; //T1<int> <==> men<int>
T1<string> s2; people()
{ }
~people()
{ } }; int main()
{
people<men> chinese; chinese.s1.setAge();
cout << chinese.s1.getAge() << endl; chinese.s2.setAge("中国人");
cout << chinese.s2.getAge() << endl; system("pause");
return ;
}

    

4. 模板与友元函数:

  4.1 类模板 与 友元函数模板:

#include <iostream>
using namespace std; template<class T>
class myclass
{
public:
myclass(T m, T n):a(m),b(n)
{
}
~myclass()
{ }
private:
T a;
T b; template<class T>
friend void show(myclass<T> my); //友元函数声明,声明也必须带上template friend void show(myclass<double> my); //明确类型的调用
}; template<class T>
void show(myclass<T> my)
{
cout << my.a << " " << my.b << endl;
} void show(myclass<double> my)
{ } int main()
{
myclass<int> my1(, );
show(my1); system("pause");
return ;
}

    

  4.2 类模板 与 友元类模板:

#include <iostream>
using namespace std; template<class T> class showit; //先声明showit类,引用友元类,创建引用或指针,唯独不能创建对象 template<class T>
class myclass
{
public:
myclass(T m, T n) :a(m), b(n)
{
} private:
T a;
T b; friend class showit<T>; //声明友元类,该类为一个类模板
}; template<class T>
class showit
{
public:
myclass<T> *p;
void set(T a, T b)
{
p = new myclass<T>(a, b);
cout << p->a << " " << p->b << endl;
}
}; int main()
{
showit<int> showit1;
showit1.set(, ); system("pause");
return ;
}

    

5. 类模板与static静态成员:

#include <iostream>
using namespace std; template<class T>
class myclass
{
public:
//静态成员不属于这个类,它在静态区,不能将其值设定在内部,
//static int num = 0; //error C2864: “myclass<T>::num”: 带有类内初始值设定项的静态 数据成员 必须具有不可变的常量整型
static int num; myclass()
{
num += ;
}
~myclass()
{
num -= ;
}
void show()
{
cout << "num=" << num << endl;
cout << typeid(*this).name() << endl;
}
}; template<class T>
int myclass<T>::num = ; //static成员,每个类型实例化都会创建一个变量;类型一致,共享;类型不一致,私有。
int main()
{
myclass<int> *p1 = new myclass<int>[]; //调用10次构造函数
myclass<int> *p3 = new myclass<int>[];
p1->show(); //20 类型一致,共享 myclass<double> *p2 = new myclass<double>[];
p2->show(); //19 类型不一致 system("pause");
return ;
}

    

6. 类模板与static静态成员函数:

  6.1 static静态成员函数没有this指针:

#include <iostream>
using namespace std; template<class T>
class myclass
{
public:
void go1()
{
this;
}
static void go2() //静态成员函数的指针类型不一样,没有this指针
{ }
}; int main()
{
auto fun1 = &myclass<int>::go1;
auto fun2 = &myclass<int>::go2; //成员函数与静态成员函数最大区别,函数指针类型不一样,静态成员函数没有this指针
cout << typeid(fun1).name() << endl;
cout << typeid(fun2).name() << endl; myclass<char> mych; system("pause");
return ;
}

    

  6.2 静态成员函数无需创建对象就可调用:

#include <iostream>
using namespace std; template<class T>
class myclass
{
public:
void go1()
{
cout << "go1" << endl;
}
static void go2() //静态成员函数的指针类型不一样,没有this指针
{
cout << "go2" << endl;
}
}; int main()
{
myclass<int>::go2(); //静态成员函数,无需创建对象就可以直接调用(既可以创建对象来调用,也可以不创建对象来调用)
//myclass<int>::go1(); myclass<int> my1;
my1.go1();
my1.go2(); system("pause");
return ;
}

    

4. STL编程四的更多相关文章

  1. C++ STL编程轻松入门基础

    C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...

  2. shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)

    一,Shell编程四剑客之Find 通过如上基础语法的学习,读者对Shell编程有了更近一步的理解,Shell编程不再是简单命令的堆积,而是演变成了各种特殊的语句.各种语法.编程工具.各种命令的集合. ...

  3. Shell编程四剑客包括:find、sed、grep、awk

    一.Shell编程四剑客之Find Find工具主要用于操作系统文件.目录的查找,其语法参数格式为: find path -option [ -print ] [ -exec -ok command ...

  4. 从零开始学C++之STL(四):算法简介、7种算法分类

    一.算法 算法是以函数模板的形式实现的.常用的算法涉及到比较.交换.查找.搜索.复制.修改.移除.反转.排序.合并等等. 算法并非容器类型的成员函数,而是一些全局函数,要与迭代器一起搭配使用. 算法的 ...

  5. 【Java并发编程四】关卡

    一.什么是关卡? 关卡类似于闭锁,它们都能阻塞一组线程,直到某些事件发生. 关卡和闭锁关键的不同在于,所有线程必须同时到达关卡点,才能继续处理.闭锁等待的是事件,关卡等待的是其他线程. 二.Cycli ...

  6. Java 并发编程(四):如何保证对象的线程安全性

    01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合 ...

  7. linux网络编程之socket编程(四)

    经过两周的等待,终于可以回归我正常的学习之旅了,表哥来北京了在我这暂住,晚上回家了基本在和他聊天,周末带他在北京城到处乱转,几乎剥夺了我自由学习的时间了,不过,亲人之情还是很难得的,工作学习并不是生活 ...

  8. Java高并发网络编程(四)Netty

    在网络应用开发的过程中,直接使用JDK提供的NIO的API,比较繁琐,而且想要进行性能提升,还需要结合多线程技术. 由于网络编程本身的复杂性,以及JDK API开发的使用难度较高,所以在开源社区中,涌 ...

  9. 【C++ STL编程】queue小例子

    STL是标准化组件,现在已经是C++的一部分,因此不用额外安装什么. #include <queue> #include <iostream> using namespace ...

随机推荐

  1. 更改Mysql数据库数据存储位置的具体步骤

    首先把mysql的服务先停掉,更改MySQL配置文件My.ini中的数据库存储主路径,将老的数据库存储主路径中的数据库文件和文件夹复制到新的存储主路径,接下来重启搞定. 一.首先把mysql的服务先停 ...

  2. react native 导航路由组件react-navigation的使用

    navigation的几个难点和问题: 1.底部tab是否可以加上中间的大按钮? 如果加上,如何触发事件? js文件放哪? 2.navigation的登录注册页面.成功后应该不能返回刚刚的登录页面?清 ...

  3. Spring AOP底层原理

    ------------------siwuxie095                                 Spring AOP 底层原理         AOP 即 Aspect Or ...

  4. Red Hat 系列如何快速定制二进制内核 RPM 包?

    随着Linux服务器越来越多了,底层系统内核想要保持版本统一就需要定制专门的二进制安装包来便捷的升级和管理. RedHat系那当然就是使用rpmbuild来做定制化管理了. 今天我们分俩个部分(roo ...

  5. 邮槽 匿名管道 命名管道 剪贴板 进程通讯 转自http://www.cnblogs.com/kzloser/archive/2012/11/04/2753367.html#

    邮槽 通信流程: 服务器 客户端 注意: 邮槽是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输 邮槽可以实现一对多的单向通信,我们可以利用这个特点编写一个网络会议通知系统,而且实现这一的系 ...

  6. 74款安卓和IOS app源码地址

    知乎专栏App https://github.com/bxbxbai/ZhuanLan WeChat高仿微信 项目地址: https://github.com/motianhuo/wechat Gan ...

  7. C语言 void 万能类型

    C中 void类型其实是一种万能类型, 也就是说 我们的 void 可以代表任意一种类型,也就是说他的范围要比具体的一种类型要宽广, 例如: int *p = NULL;void *ptr = p; ...

  8. C++中函数模版与类模版

    1.什么是模板? (1)可以这样来解释这个问题,例如当我们需要定义多个函数,而这个函数功能其实都是一样的,例如两个数相加的函数, 只是相加的两个数的类型不相同而已,这就导致我们需要定义多个函数:当我们 ...

  9. Linux文件备份

    1.tar -P是否保留根目录 -t查看压缩文件内容 -N 201401010备份日期以后 [root@localhost /]# tar -zcPf /tar/data2.tar.gz /etc/* ...

  10. 日志文件(关于#IRSA_MDPS_RDM软件 密码登录事项 7月26号)

    1.登录:sqlplus 用户名:scott 口令:123 qweas.. //2018-7-16号更改密码 2.查看该用户(已登录)下有几个表:select table_name from user ...