4. STL编程四
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编程四的更多相关文章
- C++ STL编程轻松入门基础
C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...
- shell 编程四剑客简介 find sed grep awk(微信公众号摘抄)
一,Shell编程四剑客之Find 通过如上基础语法的学习,读者对Shell编程有了更近一步的理解,Shell编程不再是简单命令的堆积,而是演变成了各种特殊的语句.各种语法.编程工具.各种命令的集合. ...
- Shell编程四剑客包括:find、sed、grep、awk
一.Shell编程四剑客之Find Find工具主要用于操作系统文件.目录的查找,其语法参数格式为: find path -option [ -print ] [ -exec -ok command ...
- 从零开始学C++之STL(四):算法简介、7种算法分类
一.算法 算法是以函数模板的形式实现的.常用的算法涉及到比较.交换.查找.搜索.复制.修改.移除.反转.排序.合并等等. 算法并非容器类型的成员函数,而是一些全局函数,要与迭代器一起搭配使用. 算法的 ...
- 【Java并发编程四】关卡
一.什么是关卡? 关卡类似于闭锁,它们都能阻塞一组线程,直到某些事件发生. 关卡和闭锁关键的不同在于,所有线程必须同时到达关卡点,才能继续处理.闭锁等待的是事件,关卡等待的是其他线程. 二.Cycli ...
- Java 并发编程(四):如何保证对象的线程安全性
01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合 ...
- linux网络编程之socket编程(四)
经过两周的等待,终于可以回归我正常的学习之旅了,表哥来北京了在我这暂住,晚上回家了基本在和他聊天,周末带他在北京城到处乱转,几乎剥夺了我自由学习的时间了,不过,亲人之情还是很难得的,工作学习并不是生活 ...
- Java高并发网络编程(四)Netty
在网络应用开发的过程中,直接使用JDK提供的NIO的API,比较繁琐,而且想要进行性能提升,还需要结合多线程技术. 由于网络编程本身的复杂性,以及JDK API开发的使用难度较高,所以在开源社区中,涌 ...
- 【C++ STL编程】queue小例子
STL是标准化组件,现在已经是C++的一部分,因此不用额外安装什么. #include <queue> #include <iostream> using namespace ...
随机推荐
- JSP中系统Date的几点不符合中国时间观的地方
正常调用系统时间的显示格式是Date date = new Date 显示出来的当前时间为Sun Nov 22 18:39:51 CST 2015 星期天的英文单词是Sun, 这个大家都是熟悉的, 这 ...
- 基于python的Appium自动化测试的坑
真的感谢@虫师 这位来自互联网的老师,让我这个原本对代码胆怯且迷惑的人开始学习自动化测试. 一开始搜索自动化测试的时候,虫师的博客园教程都是在百度的前几位的,我就跟着虫师博客园里面的教程学习.后来学s ...
- popupWindow自适应大小
// popupWindow自适应大小 popupWindow = new PopupWindow(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP ...
- TCP端口状态说明ESTABLISHED、TIME_WAIT
TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放.网络服务器程序要同时管理 ...
- asp.net core 1.1 + mysqlsugar + y-ui Demo
最近研究下asp.net core 此源码架构 : .net core mvc 简单三层 依赖注入(.net core自带) mysql + mysqlsugar +sqlsugarcore 需要修 ...
- 用WORD2007发布博客文章
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- linux每天一小步---grep命令详解
1 命令功能 grep(global regular expression print全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. g ...
- kinect相机做扫描仪扫描人体模型
- [转]快速入门系列--WebAPI--01基础
本文转自:http://www.cnblogs.com/wanliwang01/p/aspnet_webapi_base01.html ASP.NET MVC和WebAPI已经是.NET Web部分的 ...
- 自定义View--滚动View
实现这么一个效果,一个布局中有一个View,那个View会随着我们手指的拖动而滑动,这种效果该如何实现? 我们第一反应应该是自定义一个DragView类继承View,然后重写onTouchEven ...