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

C++Primer第五版 第七章习题答案(1~10)

2017-02-16 08:52 411 查看
1:知识点1:类的定义方法:struct和class两种方法的用法和区别。

知识点2:类内成员的初始化方法:成员初始化列表。编译器会调用构造函数初始化成员,可以被重载。

首先举个例子方便于理解:

#include <iostream>
#include<string>
#include<vector>
using namespace std;
/*
C++ 中保留了C语言的 struct 关键字,并且加以扩充。在C语言中,struct 只能包含成员变量,不能包含成员函数。
而在C++中,struct 类似于 class,既可以包含成员变量,又可以包含成员函数。

C++中的 struct 和 class 基本是通用的,唯有几个细节不同:
1:使用 class 时,类中的成员默认都是 private 属性的;而使用 struct 时,结构体中的成员默认都是 public 属性的。(最本质的区别)
2:class 继承默认是 private 继承,而 struct 继承默认是 public 继承(《C++继承与派生》一章会讲解继承)。
3:class 可以使用模板,而 struct 不能。
*/

//利用class定义类
class Student
{
Student(string name, int age, int score);//构造函数

string m_name;
int m_age;
int m_score;//定义三个变量

void showname()//定义一个函数
{
cout<<m_name<<"的年龄是:"<<m_age<<",得分为:"<<m_score<<endl;
}//类内定义的函数,编译器会优先视为内联函数
public:
private:
protected://三种形式
};
Student::Student(string name, int age, int score):m_name(name), m_age(age), m_score(score){ }
//成员初始化列表,将name赋给m_name,改变类内变量

//利用strcut定义类
struct Students
{
Students(string name, int age, int score);//构造函数

string m_name;
int m_age;
int m_score;//定义三个变量,默认public

void shownames()//定义一个函数
{
cout<<m_name<<"的年龄是:"<<m_age<<",得分为:"<<m_score<<endl;
}//类内类外定义皆是在同文件中,也可定义在.h文件中。
};
Students::Students(string name, int age, int score):m_name(name), m_age(age), m_score(score){ }
//列表初始化,覆盖类的内部变量

/*
总结
1:struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的
2:当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class。
3:然而对于访问控制,应该在程序里明确的指出,而不是依靠默认,这是一个良好的习惯,也让你的代码更具可读性。
*/

int main(int argc, char** argv)
{
Student stu1("小明", 18, 3);//报错:虽然已声明,但是不可访问。成员没有限定public,默认都是private,外部不可访问。
Students stu2("小明", 18, 3);//正常
stu2.shownames();
return 0;
}


此题的答案:

#include <iostream>
#include<string>
#include<vector>
using namespace std;
struct Sales_data {
Sales_data();
string bookNo;
unsigned units_sold ;
double revenue ;//类内部的变量成员不允许在定义时初始化,必须使用构造函数
};
Sales_data::Sales_data()
{
units_sold = 0;
revenue = 0.0;
}

int main(int argc, char **argv)
{
Sales_data total;//此部分和第一章21页的内容相同
if (cin >> total.bookNo >> total.units_sold >> total.revenue) {
Sales_data trans;
while (cin >> trans.bookNo >> trans.units_sold >> trans.revenue) {
if (total.bookNo == trans.bookNo) {
total.units_sold += trans.units_sold;
total.revenue += trans.revenue;//第三题的使用修改之处
}
else {
cout << total.bookNo << " " << total.units_sold << " "
<< total.revenue << endl;
total = trans;
}
}
cout << total.bookNo << " " << total.units_sold << " " << total.revenue
<< endl;
}
else {
std::cerr << "No data?!" << std::endl;
return -1;
}
return 0;
}

2:知识点1:在.h文件中声明类较好

知识点2:this指的是“这个”对象,是一个常量指针

知识点3:紧跟在参数列表之后的const表示this是一个常量指针——关于const成员函数,表明常量成员函数不能改变调用它对象的内存,也就是表示该函数只可访问,不可修改。

本小节已经介绍了combine和isbn的相关信息,直接加入该类即可。

3:将第一题中的+=操作改为使用combine函数即可。

4 . 5:使用class来实现这个类

#include <iostream>
#include<string>
#include<vector>
using namespace std;
class Person
{
public://声明为public
Person(string Client_name, string Client_address);//构造函数
Person();//构造函数的重载

string name;
string address;//内部变量

void Show_info()
{
cout<<name<<"'s"<<" address is "<<address<<endl;
}//类内定义函数

string& const getname()
{
return name;
}
string& const getaddress()
{
return address;
}//返回姓名地址的函数,只可访问,不可修改
};
Person::Person(string Client_name, string Client_address):name(Client_name),address(Client_address){};//构造函数定义内部变量
//此处我们在一个文件内定义了该类,如若类较大,应置于.h文件中
int main(int argc, char **argv)
{
Person Client1("Mr.right","your heart");//实例化
Client1.Show_info();//调用其中的显示信息函数
return 0;
}


最好是const,这样就可以保证该函数只能访问内部变量而不能写内部变量。

6 . 7:知识点1:与类相关的函数虽然可以定义声明分开,但是需要将其与类放在同一个文件中,这样在使用接口时只需要引入一个文件即可。

加入书中的三个函数即可

替换掉原来的三种操作皆可

8:知识点:普通引用和常量引用的区别在于你是否想改变它~

9:知识点:撰写头文件时,无论是否被包含在其他任何头文件中,都应设置保护符,防止重复包含

撰写头文件时应加上以下代码:

#ifndef Cccc//第一次包含本头文件时,#ifndef判断为真,预处理器将处理后面的内容直到#endif,此时的预处理变量Cccc已定义
#define Cccc//第二次包含本头文件时,#ifndef判断为假,预处理器将忽略后面的内容,预处理变量一般定义为本头文件的大写形式
/*
....
*/
#endif//只要简单的加上就好了,无视C++中的作用域规则


稍加修改即可:

istream& read(istream& is, Person& person)
{
is >> person.name >> person.address;
if (is) person = Person();
return is;//返回输入流
}//接受一个IO类型的引用作为其参数,IO类属于不能被拷贝的类型,只能用引用来传递它们

ostream& print(ostream& os, const Person& person)
{
os << person.name << " " << person.address;
return os;
}


10:很明显由外向内的分析,条件语句的作用是同时判断两次读操作的对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息