您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-16 09:44 567 查看
21:知识点1:一个类无论是类模版还是普通类,都可以将其成员函数定义为模版,称之为成员模版,但是成员模版不能是虚函数

debug.h

#ifndef DEBUG_H
#define DEBUG_H

class Debugdelete
{
public:
Debugdelete(ostream &s = cerr):os(s){}//构造函数
template <typename T> void operator()(T *p) const//const表示该函数不会修改类的成员数据
{
os<<"deleting..."<<endl;//额外信息,我们的删除器可以做用于任何版本类型
delete p;//接受一个指针作为参数,并且删除该指针
}
private:
ostream &os;//私有成员为一个输出流
};
#endif DEBUG_H


main.cpp

#include <iostream>
#include <vector>
#include <list>
#include <string>
#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<int,Debugdelete> m(new int,Debugdelete());//P418页见表12.4
shared_ptr<int> n(new int,Debugdelete());//P412页见表12.3


23:?不懂什么意思

24:知识点:在类模版内定义模版函数,主要的区别就是他们有着自己独立的模版参数,所以我们在类模版外定义一个模版成员函数时,必须同时为类模版和成员模版提供模版参数

T表示一个类型,IT表示一个类型,IT可以是迭代器类型,实例化时传入迭代器即可

#ifndef BLOB_H
#define BLOB_H

template<typename T> class Blob
{
public:
template<typename IT> Blob(IT &, IT &);//声明
};

//类外定义,首先需要声明类模版参数列表,还要加上成员自己的模版参数列表,还有类作用域Blob<T>
template<typename T>
template<typename IT> Blob<T>:: Blob(IT &a, IT &b):data(make_shared<vector<T>>(a.b)){}
#endif BLOB_


25:知识点1:对于模版使用时才会被实例化,会产生一个问题:相同的实例可能会出现在多个对象文件中,这时候每个文件都会有一份实例化的副本,这无疑造成了很大的额外开销,所以在C++11新标准下,我们可以使用显示实例化以避免这样的开销,所有的模版参数会被替换为模版实参:

extern template class Blob<string>;        //实例化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<int>的实例

d:没有实例化,指针不会实例化,指针包含的是地址

e:实例化出一个Stack<char>的实例,因为函数接收到数据,而且是按值传递

f:实例化出一个Stack<string>的实例,

28:知识点1:标准库智能指针类型,shared_ptr可以共享指针,unique_ptr独享指针,他们允许用户重载其删除器的方式(见22题)

知识点2:unique_ptr在编译时绑定删除器,shared_ptr在运行是绑定编译器

目前不会,实现shared_ptr?

29:不会

30:不会
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息