C++Primer第五版 第十六章习题答案(21~30)

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:不会


你可能感兴趣的:(【C++Primer习题】,C++Primer,第五版习题答案详解)