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. go_字符和字符串处理

    rune相当于go的char 使用range遍历pos,rune对 使用utf8.RuneCountInString(s)获得字符数量 使用len获得字节长度,使用[]byte获得字节 一般把字节转成 ...

  2. viewer.js--一个强大的jQuery图像查看插件

    Viewer 是一款强大的 jQuery 图像浏览插件. 主要功能: 支持选项 支持方法 支持事件 支持触摸 支持移动 支持缩放 支持旋转 支持键盘 跨浏览器支持 查看演示      立即下载 部分插 ...

  3. react-native 打包 出apk

    先上步骤: 一. 生成签名文件(my-release-key.keystore文件) Android要求所有应用都有一个数字签名才会被允许安装在用户手机上 1.  在项目目录下运行如下命令: keyt ...

  4. 使用IntelliJ IDEA,gradle开发Java web应用步骤

    最近 正在学习gradle构建工具的使用,看了一堆的文档,有点一知半解,索性动作实践一把,在以后的自己的项目中尝试使用看看.目前手头用的是IntelliJ IDEA 14,搭建了一天终于明白怎么集成g ...

  5. MFC The Screen Flickers When The Image Zoomed

    问题描述 当初写MFC也是不情愿的. 既然写了,遇到一些问题. 解决也废了一切功夫.所以简单的记录一下. 这个问题,也就是使用MFC显示图像的时候, 放缩图像的过程中, 图像会一闪一闪的. 这个问题的 ...

  6. Greeplum 系列(一) Greenplum 架构

    Greeplum 系列(一) Greenplum 架构 Greenplum 可进行海量并行处理 (Massively Parallel Processing) 一.Greenplum 体系架构 Gre ...

  7. Java 设计模式系列(七)桥接模式

    Java 设计模式系列(七)桥接模式 桥接模式(Bridge)是一种结构型设计模式.Bridge 模式基于类的最小设计原则,通过使用封装.聚合及继承等行为让不同的类承担不同的职责.它的主要特点是把抽象 ...

  8. Spring boot——logback.xml 配置详解(四)<filter>

    阅读目录 1 filter的使用 2 常用的过滤器 文章转载自:http://aub.iteye.com/blog/1101260,在此对作者的辛苦表示感谢! 回到顶部 1 filter的使用 < ...

  9. WAMP不能启动, 一直处于红色图标或者橙色图标的解决办法

    WAMP不能启动, 一直处于红色图标(正常启动为绿色吧) 考虑是端口的问题,我找到wamp文件夹中的wamp\bin\apache\apache2.2.22\conf路径下的httpd.conf文件, ...

  10. appium镜像设置

    npm --registry http://registry.cnpmjs.org install -g appium 使用npm的国内镜像可以安装,速度很不错. 以后不想输入ip的话可以输入以下命令 ...