C++Primer第五版 第十六章习题答案(21~30)
2017-03-16 09:44
567 查看
21:知识点1:一个类无论是类模版还是普通类,都可以将其成员函数定义为模版,称之为成员模版,但是成员模版不能是虚函数
debug.h
main.cpp
22:知识点:可以对类型的删除器进行重载我们自己定义的版本,在尖括号中给出删除器的类型,并提供一个这个类型的对象给它的构造函数即可
两种指针类型重载删除器的方式不同:
23:?不懂什么意思
24:知识点:在类模版内定义模版函数,主要的区别就是他们有着自己独立的模版参数,所以我们在类模版外定义一个模版成员函数时,必须同时为类模版和成员模版提供模版参数
T表示一个类型,IT表示一个类型,IT可以是迭代器类型,实例化时传入迭代器即可
25:知识点1:对于模版使用时才会被实例化,会产生一个问题:相同的实例可能会出现在多个对象文件中,这时候每个文件都会有一份实例化的副本,这无疑造成了很大的额外开销,所以在C++11新标准下,我们可以使用显示实例化以避免这样的开销,所有的模版参数会被替换为模版实参:
知识点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:不会
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:不会
相关文章推荐
- C++Primer第五版 第三章习题答案(21~30)
- C++Primer第五版 第七章习题答案(21~30)
- C++Primer第五版 第二章习题答案(21~30)
- C++Primer第五版 第六章习题答案(21~30)
- C++Primer第五版 第十三章习题答案(21~30)
- C++Primer第五版 第九章习题答案(21~30)
- C++Primer第五版 第十二章习题答案(21~30)
- C++Primer第五版 第十章习题答案(21~30)
- C++Primer第五版 第十五章习题答案(21~30)
- C++Primer第五版 第四章习题答案(21~30)
- C++Primer第五版 第十一章习题答案(21~30)
- C++Primer第五版 第十八章习题答案(21~30)
- C++Primer第五版 第五章习题答案(21~25)
- C++Primer第五版 第十六章习题答案(51~60)
- C++Primer第五版 第十六章习题答案(31~40)
- C++Primer第五版 第十六章习题答案(41~50)
- C++Primer第五版 第十六章习题答案(11~20)
- C++Primer第五版 第十六章习题答案(1~10)
- C++Primer第五版 第十九章习题答案(21~26)
- C++Primer第五版 第八章习题答案(11~14)