首页 > 编程 > C++ > 正文

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

2019-11-08 19:43:19
字体:
来源:转载
供稿:网友

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:很明显由外向内的分析,条件语句的作用是同时判断两次读操作的对象。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选