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

C++Primer第五版 第十九章习题答案(11~20)

2017-03-23 09:30 579 查看
11:知识点1:枚举类型使得我们可以将一组整型常量组织在一起,但是每一个枚举类型都定义了一种新的类型

知识点2:C++11新标准引入了限定作用域的枚举类型,带有class或struct关键字的,就是限定作用域的枚举类型,形式为enum (class/struct) XX { 枚举成员 };,注意后面需要加分号结尾,若enum没有名字,那么我们只能在定义时初始化该对象

知识点3:在限定作用域的枚举类型中,遵循常规的作用域准则,在枚举类型作用域外不可访问,不限定作用域的枚举类型,枚举成员的作用域和枚举类型本身的作用域相同(一般来说两个不限定作用域的枚举类型的成员不可以相同,因为其作用域是相同的,会重复定义)

知识点4:默认情况下,枚举成员的枚举值从0开始,依次加1,但我们也可以为枚举成员指定初值

知识点5:枚举成员是const的,所以赋值时必须使用常量表达式

知识点6:要想初始化一个enum对象或者为enum赋值,必须使用该类型的一个枚举成员或者该类型的另一个对象,不限定作用域的枚举类型的对象或其枚举成员会自动转换为整形

知识点7:C++11新标准,可以在enum之后加上冒号再加上我们想在enum中使用的类型:enum:unsigned int {},默认情况下为int。可以先声明不定义

知识点8:成员指针是指可以指向类的非静态成员的指针,由于类的静态成员不属于任何对象,所以无需特殊的指向该成员的指针,成员指针的类型需要包括类的类型和成员的类型,例如:const string Screen:: *p,一个指向Screen类的const string成员的指针p

知识点9:在给成员指针赋值时,我们将取址运算符作用域screen的成员而不是内存中的一个类的对象的成员

知识点10:我们需要注意,当我们初始化一个成员指针或为成员指针赋值时,该指针并没有指向任何数据,成员指针只指定了成员而非该成员所属的对象,只有解引用成员指针时我们才提供对象的信息

知识点11:成员指针的访问运算符:.*或者->*,可以获得对象的指定成员

知识点12:由于在类中数据成员一般都是私有类型的,所以通常我们不能直接获得数据成员的指针,最好的方法就是定义一个函数,返回一个指向该成员的指针(return &XX)

答案:见知识点8、9、10、11

12:根据知识点12,私有成员一般定义一个函数返回成员指针

static const pos Screen::*data() {
return &Screen::cursor;
}


13:一般将该指针的函数定义为静态成员

static const std::string Sales_data::* data()
{
return &Sales_data::bookNo;
}


14:知识点1:可以使用auto来自动判断指向成员函数的指针类型,若该函数存在重载,则必须要显式的声明函数类型(将形参确定):char (Screen::*p) (Screen::pos,Screen::pos) const;其中的括号都是必不可少的

知识点2:在成员函数和指向该成员的指针之间不存在自动转换的规则(必须使用&符号,显示的取地址)

知识点3:使用指向成员函数的指针时,在解引用完成之后需要加一对小括号,在其之前的括号也是必须的,另外还可以传入实参:char c = (MyScreen.*P) (0,0),指向成员函数的一个指针

知识点4:由于有时指向成员函数的指针较为复杂,我们可以使用类型别名来简化处理:

using Action = char (Screen::*p) (Screen::pos,Screen::pos) const;  Action的类型就是指向成员函数的指针

知识点5:成员函数表,保存自身函数的指针,为private,组成一个数组,有时会比较有用

答案:应该是合法的,因为这里只是给该指针重新赋值

15:答案:见知识点2、另外还需要说明所属类,也就是类型不同

16:见知识点4

using Avg = double (Sales_data::*)() const;


17:

char get() const { return contents[cursor]; }//using Action_c_v = char (Screen::*)()const;
char get_cursor() const { return contents[cursor]; }//同上
inline char get(pos ht, pos wd) const;//using Action_c_uu = char (Screen::*)(pos,pos)const;
Screen &move(pos r, pos c);//using Action_Screen_uu = Screen &(Screen::*)(pos,pos);


18:知识点1:因为成员指针不是可调用对象,所以我们不能直接将一个指向成员函数的指针传递给算法

auto p = &string::empty;//string类的empty()函数的指针p
find_if(vec.begin(),vec.end(),p);//该算法需要传入一个函数,而我们传入的是指针


知识点2:要想通过成员指针调用函数,必须使用->*运算符

知识点3:若想从指向成员函数的指针获取可调用对象的一种方法是使用标准库模版function,头文件为functional

function <bool (const string&)> fcn = &string::empty;//empty()是一个接受string参数并返回bool值的函数
find_if(vec.begin(),vec.end(),fcn);//正确


知识点4:标准库功能mem_fn让编译器负责推断成员的类型

find_if(vec.begin(),vec.end(),mem_fn(&string::empty));//mem_fn会生成一个可调用对象


知识点5:bind函数也可以从成员函数生成一个可调用对象

find_if(vec.begin(),vec.end(),bind(&string::empty,_1));//bind会生成一个可调用对象,第一个实参既可以是指针也可以是引用


答案:

/***************************************************************************
*  @file       main.cpp
*  @author     MISAYAONE
*  @date       22  March 2017
*  @remark     22  March 2017
***************************************************************************/

#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <algorithm>//count_if头文件
using namespace std;

int main(int argc,char** argv)
{
vector<string> vec;
vec.push_back("123");
vec.push_back("");
//auto p = &string::empty();//生成指针

// 	function<bool (const string&)> p = &string::empty;
// 	size_t _sum = count_if(vec.begin(),vec.end(),p);

/*size_t _sum = count_if(vec.begin(),vec.end(),men_fn(&string::empty));*///C++11新标准

size_t _sum = count_if(vec.begin(),vec.end(),bind(&string::empty,std::placeholders::_1));//占位符需要命名空间
cout<<_sum<<endl;
cin.get();
return 0;
}


19:只写核心部分的函数

std::vector<Sales_data>::const_iterator count(const std::vector<Sales_data> &vec, double d) {
auto fun = std::bind(&Sales_data::avg_price, std::placeholders::_1);
return find_if(vec.cbegin(), vec.cend(), [&](const Sales_data &s) { return d < fun(s); });
}


20:知识点1:一个类可以定义在另一个类的内部,被称为嵌套类,常用于定义作为实现部分的类

知识点2:嵌套类是一个独立的类,与外层类没什么关系,并且外层类对象与内层类对象是相互独立的,嵌套类对象中不包含任何外层类的成员

知识点3:嵌套类的名字在外层类的作用域中是可见的,两者都没有对对方特殊的访问权限

知识点4:嵌套类对象与外层类对象没有任何关系,是独立的!~

又要回头写这个,直接放到里面就好了吧~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息