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. Spring boot 、swagger、c3p0、mybatis和redis 整合

    文件路径                添加依赖 <?xml version="1.0" encoding="UTF-8"?> <projec ...

  2. c语言二维数组与指针

    问题,以下输出的结果是什么,区别在于哪? void main() { ][] = { ,,,,,,,,,,, }; //输出的3个地址都一样,差别在哪? printf("\n%x" ...

  3. Java Thread系列(七)死锁

    Java Thread系列(七)死锁 当线程需要同时持有多个锁时,有可能产生死锁.考虑如下情形: 线程 A 当前持有互斥所锁 lock1,线程 B 当前持有互斥锁 lock2.接下来,当线程 A 仍然 ...

  4. etl业务说明图

  5. 聚合函数 listagg (超出长度限制时xmlagg)

    表&数据 ),buy ),price NUMBER); ); ); ); 原来的结果 SELECT * FROM PEOPLEBUY ORDER BY PEOPLE; 想要的结果 SELECT ...

  6. swift的可选值(optional)

    苹果那文档写了一大堆也没有好好的写一下可选值(optional)这个东西.就是在有一个“Optional Chaining”的章节,但是也不是很充分的说明.最后找了半天在“the basics”里墨迹 ...

  7. Google Tango初学者教程

    Getting Started with the Tango Java API In this tutorial, we'll go through setting up your build env ...

  8. PowerDesigner工具建表步骤

    以商场VIP系统中的表为例 先建立管理员用户表 1.双击打开PowerDesigner工具,点File 选择 New Model  打开如下图,选择标红部分,点击OK 2点击选择标红部位Entity ...

  9. 解决idea gradle构建Received fatal alert: handshake_failure问题

    Gradle是一款强大的构建工具,但是搭建项目运行环境总是非常头痛,各种网络原因会导致项目不能成功的导入. 说一下这个问题的解决办法,折腾了很久终于解决了. javax.net.ssl.SSLHand ...

  10. 目前主流编译器对C++11特性的支持情况

    目前主流编译器对C++11特性的支持情况 1. GCC编译器(从编译器GCC4.8.X的版本完全支持) (1)目前C++11特性,之前成为C++0X特性,从GCC4.3的后续版本中逐步对C++11进行 ...