IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 《C++ Primer》第19章 19.4节习题答案 -> 正文阅读

[C++知识库]《C++ Primer》第19章 19.4节习题答案

《C++ Primer》第19章 特殊工具与技术

19.4节 类成员指针 习题答案

练习19.11:普通的数据指针与指向数据成员的指针有何区别?

【出题思路】

通过和普通数据指针做对比,理解成员指针。

【解答】

区别在于:指定指向数据成员的指针的类型时,除了给出成员本身的类型之外,还必须给出所属类的类型。例如:指向int型数据的普通数据指针的类型为int*,而指向C类的int型数据成员的成员指针的类型为int C::*。

练习19.12:定义一个成员指针,令其可以指向Screen类的cursor成员。通过该指针获得Screen::cursor的值。

【出题思路】

本题练习成员指针的定义。

【解答】

指向Screen类cursor成员的成员指针pm可定义如下:

pos Screen::* pm = & Screen::cursor;

可使用成员指针解引用操作符(.*)从对象或引用获取成员,使用成员指针箭头操作符(->*)通过对象的指针获取成员。

假设有如下对象定义:

Screen myScreen;

则可以这样通过成员指针pm获取Screen::cursor的值:

myScreen .*pm;

假设有如下对象指针定义:

Screen *pScreen;

则可以这样通过成员指针pm获取Screen::cursor的值:

pScreen->*pm;

练习19.13:定义一个类型,使其可以表示指向Sales_data类的bookNo成员的指针。

【出题思路】

成员指针的相关使用练习。

【解答】

Sales_data类的bookNo成员是一个数据成员,其类型为std::string,可以表示Sales_data类的bookNo成员的指针的类型为:

std::string Sales_data::*;

练习19.14:下面的代码合法吗?如果合法,代码的含义是什么?如果不合法,解释原因。

auto pmf = &Screen::get_cursor;
pmf = &Screen::get;

【出题思路】

本题练习成员函数指针的使用。

【解答】

合法。

auto pmf = &Screen::get_cursor;
//pmf是一个指向Screen成员函数的指针
pmf = & Screen::get;
//pmf此时指向get,get的版本是根据pmf的类型推断出来的,即无参,返回char的版本。

练习19.15:普通函数指针和指向成员函数的指针有何区别?

【出题思路】

通过与普通函数指针进行对比,熟悉理解成员函数指针。

【解答】

区别在于:指定指向成员函数的指针类型时,除了给出成员本身的类型之外,还必须给出成员函数所属类的类型并指明成员函数是否为const。例如:指向int型数据的普通数据指针的类型为int*,指向“不带参数并返回int型值的函数”的普通函数指针的类型为int(*)(),而指向“C类的不带参数并返回int型值的const成员函数”的函数成员指针的类型为int (C::*)()const。

练习19.16:声明一个类型别名,令其作为指向Sales_data的avg_price成员的指针的同义词。

【出题思路】

本题是成员指针的类型别名定义的练习,方便程序中对含有成员指针代码的读写。

【解答】

Sales_data的avg_price成员是一个函数成员,其原型为:

double avg_price() const;

定义如下类型别名Pt,作为可指向Sales_data的avg_price成员的指针的同义词:

typedef double(Sales_data::*Pt) () const;
//然后可以像下面这样定义和使用函数指针
Pt pFunc = &Sales_data::avg_price;
Sales_data sd;
(sd.*pFunc)();

练习19.17:为Screen的所有成员函数类型各定义一个类型别名。

【出题思路】

本题练习成员函数类型别名的定义,方便代码读写。

【解答】

在给出的Screen类版本中,成员函数有4个可区分类型,2个get函数为2个不同类型,home等5个光标移动函数为一个类型,move函数为一个类型。因此可以定义4个类型别名Pmf1、Pmf2、Pmf3和Pmf4:

typedef char (Screen::*Pmf1)() const;
typedef char (Screen::*Pmf2)(Screen::index, Screen::index) const;
typedef Screen& (Screen::*Pmf3)();
typedef Screen& (Screen::*Pmf4) (Screen::Directions);

练习19.18:编写一个函数,使用count_if统计在给定的vector中有多少个空string。

【出题思路】

利用函数对象统计满足条件的对象的个数。

【解答】

首先用mem_fn将string的empty成员函数转换为可调用对象,将它作为第三个参数传递给count_if即可实现统计所有空string(令empty返回真值)的数量。

count_empty_string(vector<string> &vs)
{
	auto f = mem_fn(&string::empty);
	return count_if(vs.begin(), vs.end(), f);
}

练习19.19:编写一个函数,令其接受vector<Sales_data>并查找平均价格高于某个值的第一个元素。

【出题思路】

练习用bind将成员函数转换为可调用对象。

【解答】

Sales_data类的成员函数avg_price返回平均价格,但它不能将平均价格与某个值进行比较,因此创建函数check_value,比较avg_price()的返回值和一个给定的值,返回是否平均价格更高。用bind将check_value转换为可调用对象(一元谓词),可调用对象的唯一参数(Sales_data对象引用)作为check_value的第一个参数,用来比较的值作为check_value的第二个参数。

bool check_value(Sales_data &sd, double t)
{
	return sd.avg_price() > t;
}

vector<Sales_data>::iterator find_first_high(vector<Sales_data> &vsd, double t)
{
	auto f = bind(check_value, _1, t);
	return find_if(vsd.begin(), vsd.end(), f);
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-15 15:39:53  更:2021-11-15 15:42:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:31:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码