21:知识点1:一个类无论是类模版还是普通类,都可以将其成员函数定义为模版,称之为成员模版,但是成员模版不能是虚函数
debug.h
#ifndef DEBUG_H
#define DEBUG_H
class Debugdelete
{
public:
Debugdelete(ostream &s = cerr):os(s){}//构造函数
template void operator()(T *p) const//const表示该函数不会修改类的成员数据
{
os<<"deleting..."<
main.cpp
#include
#include
#include
#include
#include "Debug.h"
using namespace std;
int main(int argc,char** argv)
{
double *p = new double;//新分配一个double对象
Debugdelete d;//创建一个删除器对象
d(p);//调用定义的模版函数operator (),对p进行释放
cin.get();
return 0;
}
22:知识点:可以对类型的删除器进行重载我们自己定义的版本,在尖括号中给出删除器的类型,并提供一个这个类型的对象给它的构造函数即可
两种指针类型重载删除器的方式不同:
unique_ptr m(new int,Debugdelete());//P418页见表12.4
shared_ptr n(new int,Debugdelete());//P412页见表12.3
23:?不懂什么意思
24:知识点:在类模版内定义模版函数,主要的区别就是他们有着自己独立的模版参数,所以我们在类模版外定义一个模版成员函数时,必须同时为类模版和成员模版提供模版参数
T表示一个类型,IT表示一个类型,IT可以是迭代器类型,实例化时传入迭代器即可
#ifndef BLOB_H
#define BLOB_H
template class Blob
{
public:
template Blob(IT &, IT &);//声明
};
//类外定义,首先需要声明类模版参数列表,还要加上成员自己的模版参数列表,还有类作用域Blob
template
template Blob:: Blob(IT &a, IT &b):data(make_shared>(a.b)){}
#endif BLOB_
25:知识点1:对于模版使用时才会被实例化,会产生一个问题:相同的实例可能会出现在多个对象文件中,这时候每个文件都会有一份实例化的副本,这无疑造成了很大的额外开销,所以在C++11新标准下,我们可以使用显示实例化以避免这样的开销,所有的模版参数会被替换为模版实参:
extern template class Blob; //实例化class声明
template int compare(const int&, const int&); //实例化compare函数定义
知识点2:当编译器遇到extern模版声明时,不会在本文件中生成实例化代码。将一个实例化声明为extern,就表示承诺在程序其他位置有该实例化的一个非extern定义,只能有一个定义!
知识点3:extern声明必须出现在任何使用该实例化版本的代码之前,其定义可以不放在本文件中,但是必须将定义的文件链接进来。
知识点4:一个类模版的实例化定义会实例化该模版的所有成员,包括内联函数成员,因为我们也不知道程序会使用那些成员函数,所以我们必须将其全部实例化,这就要求在实例化定义中,所用类型必须能作用于模版的所有成员函数
实例化声明class vector
实例化定义class vector,编译器会产生代码
26:不可以,因为其所有成员函数在实例化过程中都将被实例化,Nodefault也需要实例化,没有默认构造函数是不行的
27:
a:没有实例化,只有在有数据时才会实例化
b:没有实例化,引用并不会实例化,因为没有数值存在
c:实例化出一个Stack
d:没有实例化,指针不会实例化,指针包含的是地址
e:实例化出一个Stack
f:实例化出一个Stack
28:知识点1:标准库智能指针类型,shared_ptr可以共享指针,unique_ptr独享指针,他们允许用户重载其删除器的方式(见22题)
知识点2:unique_ptr在编译时绑定删除器,shared_ptr在运行是绑定编译器
目前不会,实现shared_ptr?
29:不会
30:不会