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. 微信小程序通讯录首字母索引效果,车辆品牌选择列表

    效果图: wxml代码: <block wx:for="{{list}}"> <view class='letter' id="letter{{inde ...

  2. zabbix 2.0 安装

    2.0环境 采用Centos6.3_64位操作系统 Zabbix安装 Zabbix 2.0 for RHEL5: # rpm -ivh http://repo.zabbix.com/zabbix/2. ...

  3. c语言蛋疼的字符串赋值

    我觉得c语言比较蛋疼的一个地方就是给字符串赋值,不是初始化,是赋值. char string[20]={0}; 你不能通过 string="hello";这种方式赋值.但是在字符串 ...

  4. Redis安装部署、Jedis的使用

    一.NoSQL概述 为什么需要NoSQL High performance -高并发读写 Huge Storage - 海量数据的高效率存储和访问 High Scalability && ...

  5. 08 Translating RNA into Protein

    Problem The 20 commonly occurring amino acids are abbreviated by using 20 letters from the English a ...

  6. swift学习之UITabelView ----使用xib定义cell

    // //  TwoViewController.swift //  tab // //  Created by su on 15/12/7. //  Copyright © 2015年 tian. ...

  7. underscore collections

    1._.each(list, iterator, [context]):对集合中每一元素执行处理器方法. 如果传递了context参数,则把iterator绑定到context对象上.每次调用iter ...

  8. Zabbix部署与使用

    *******需要配置网易YUM源来安装相关依赖包: [local_yum] name=local_yum baseurl=http://mirrors.163.com/centos/6/os/x86 ...

  9. linux常见命令-查看磁盘空间

    linux查看磁盘使用情况命令 1. 统一每个目录下磁盘的整体情况: df -h 2. 查看指定目录,在命令后直接放目录名,比如查看“usr”目录使用情况:df -h  /usr/ 3. 查看当前目录 ...

  10. FMX.Platform.TApplicationEvent

    FMX.Platform.TApplicationEvent http://docwiki.embarcadero.com/Libraries/Seattle/en/FMX.Platform.TApp ...