国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

c++ primer中文版第五版作業(yè)第七章

這篇具有很好參考價(jià)值的文章主要介紹了c++ primer中文版第五版作業(yè)第七章。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

倉(cāng)庫(kù)地址

7.1

#include <iostream>
#include <string>
using namespace std;
struct Sales_data
{
	string bookNo;
	unsigned units_sold{0};
	double revenue{0.0};
};
int main(void)
{
	struct Sales_data  total,trans;
	double price;
	if(cin>>total.bookNo)
	{
		cin>>total.units_sold>>price;
		total.revenue=total.units_sold*price;
		while(cin>>trans.bookNo)
		{
			cin>>trans.units_sold>>price;
			trans.revenue=trans.units_sold*price;
			if(total.bookNo==trans.bookNo)
			{
				total.units_sold+=trans.units_sold;
				total.revenue+=trans.revenue;
			}
			else
			{
				cout<<total.bookNo<<" "<<total.units_sold<<" "<<total.revenue<<" "<<total.revenue/total.units_sold<<endl;
				total.bookNo=trans.bookNo;
				total.units_sold=trans.units_sold;
				total.revenue=trans.revenue;
			}
		}
		cout<<total.bookNo<<" "<<total.units_sold<<" "<<total.revenue<<" "<<total.revenue/total.units_sold<<endl;
	}
	else
	{
		cerr<<"No data?"<<endl;
		return -1;
	}
	return 0;
}

7.2

#include <string>
struct Sales_data
{
	std::string bookNo;
	unsigned units_sold=0;
	double revenue=0.0;
	std::string isbn() const  {return bookNo;}
	Sales_data &combine(const Sales_data &);
};
Sales_data & Sales_data::combine(const Sales_data &rhs)
{
	units_sold+=rhs.units_sold;
	revenue+=rhs.revenue;
	return *this;
}

7.3

Sales_data total;
if(read(cin,total))
{
	Sales_data trans;
	while(read(cin,trans))
	{
		if(total.isbn()==trans.isbn())
			total.combine(trans);
		else
		{
			print(cout,total)<<endl;
			total=trans;
		}
	}
	print(cout,total)<<endl;
}
else
	cerr<<"No data?!"<<endl;

7.4

#include <string>
struct Person
{
	std::string name;
	std::string address;
};

7.5

#include <string>
struct Person
{
	std::string name;
	std::string address;
	std::string getName() const { return name; }
	std::string getAddress const { return address; }
};

7.6

istream &read(istream &is,Sales_data &item)
{
	double price=0;
	is>>item.bookNo>>item.units_sold>>price;
	item.revenue=item.units_sold*price;
	return is;
}
ostream &print(ostream *os,Sales_data &item)
{
	os<<item.isbn()<<" "<<item.units_sold<<" "<<item.revenue<<" "<<item.avg_price();
	return os;
}
Sales_data add(const Sales_data &lhs,const Sales_data &rhs)
{
	Sales_data sum=lhs;
	sum.combine(rhs);
	return sum;
}

7.7

#include <iostream>
#include <string>
using namespace std;
struct Sales_data
{
	std::string bookNo;
	unsigned units_sold=0;
	double revenue=0.0;
	std::string isbn() const  {return bookNo;}
	Sales_data &combine(const Sales_data &);
	double avg_price() const;
};
double Sales_data::avg_price() const
{
	if(units_sold)
		return revenue/units_sold;
	else
		return 0;
}
Sales_data & Sales_data::combine(const Sales_data &rhs)
{
	units_sold+=rhs.units_sold;
	revenue+=rhs.revenue;
	return *this;
}
istream &read(istream &is,Sales_data &item)
{
	double price=0;
	is>>item.bookNo>>item.units_sold>>price;
	item.revenue=item.units_sold*price;
	return is;
}
ostream &print(ostream &os,Sales_data &item)
{
	os<<item.isbn()<<" "<<item.units_sold<<" "<<item.revenue<<" "<<item.avg_price();
	return os;
}
Sales_data add(const Sales_data &lhs,const Sales_data &rhs)
{
	Sales_data sum=lhs;
	sum.combine(rhs);
	return sum;
}
int main(void)
{
	Sales_data total;
	if(read(cin,total))
	{
		Sales_data trans;
		while(read(cin,trans))
		{
			if(total.isbn()==trans.isbn())
				total.combine(trans);
			else
			{
				print(cout,total)<<endl;
				total=trans;
			}
		}
		print(cout,total)<<endl;
	}
	else
		cerr<<"No data?!"<<endl;
	return 0;
}

7.8

??因?yàn)?code>read函數(shù)會(huì)修改其數(shù)值而print函數(shù)不會(huì)。

7.9

#include <iostream>
#include <string>
struct Person
{
	std::string name;
	std::string address;
	std::string getName() const { return name; }
	std::string getAddress const { return address; }
};
istream & read(istream &is,Person &rp)
{
	is>>rp.name>>rp.address;
	return is;
}
ostream & print(ostream &os,Person &rp)
{
	os<<rp.getName()<<" "<<rp.getAddress();
	return os;
}

7.10

??從cin中讀如數(shù)據(jù)到data1,如果成功就再?gòu)?code>cin中讀取數(shù)據(jù)到data2,如果成功就執(zhí)行if后的語(yǔ)句。

7.11

#include <iostream>
#include <string>
using namespace std;
struct Sales_data
{
	string bookNo;
	unsigned units_sold=0;
	double revenue=0.0;
	std::string isbn() const  {return bookNo;}
	Sales_data &combine(const Sales_data &);
	double avg_price() const;
	Sales_data()=default;
	Sales_data(istream &is);
	Sales_data(const string &s):bookNo(s){}
	Sales_data(const string &s,unsigned n,double p):bookNo(s),units_sold{n},revenue{n*p}{}
};
double Sales_data::avg_price() const
{
	if(units_sold)
		return revenue/units_sold;
	else
		return 0;
}
Sales_data & Sales_data::combine(const Sales_data &rhs)
{
	units_sold+=rhs.units_sold;
	revenue+=rhs.revenue;
	return *this;
}
istream &read(istream &is,Sales_data &item)
{
	double price=0;
	is>>item.bookNo>>item.units_sold>>price;
	item.revenue=item.units_sold*price;
	return is;
}
ostream &print(ostream &os,Sales_data &item)
{
	os<<item.isbn()<<" "<<item.units_sold<<" "<<item.revenue<<" "<<item.avg_price();
	return os;
}
Sales_data add(const Sales_data &lhs,const Sales_data &rhs)
{
	Sales_data sum=lhs;
	sum.combine(rhs);
	return sum;
}
Sales_data::Sales_data(istream &is)
{
	read(is,*this);
}
int main(void)
{
	Sales_data a;
	print(cout,a)<<endl;
	Sales_data b("1992");
	print(cout,b)<<endl;
	Sales_data c{"1992",1,20};
	print(cout,c)<<endl;
	Sales_data d{cin};
	print(cout,d)<<endl;
	return 0;
}

7.12

#include <iostream>
#include <string>
using namespace std;
struct Sales_data;
istream &read(istream &is,Sales_data &item);
struct Sales_data
{
	string bookNo;
	unsigned units_sold=0;
	double revenue=0.0;
	std::string isbn() const  {return bookNo;}
	Sales_data &combine(const Sales_data &);
	double avg_price() const;
	Sales_data()=default;
	Sales_data(istream &is){read(is,*this);}
	Sales_data(const string &s):bookNo(s){}
	Sales_data(const string &s,unsigned n,double p):bookNo(s),units_sold{n},revenue{n*p}{}
};
double Sales_data::avg_price() const
{
	if(units_sold)
		return revenue/units_sold;
	else
		return 0;
}
Sales_data & Sales_data::combine(const Sales_data &rhs)
{
	units_sold+=rhs.units_sold;
	revenue+=rhs.revenue;
	return *this;
}
istream &read(istream &is,Sales_data &item)
{
	double price=0;
	is>>item.bookNo>>item.units_sold>>price;
	item.revenue=item.units_sold*price;
	return is;
}
ostream &print(ostream &os,Sales_data &item)
{
	os<<item.isbn()<<" "<<item.units_sold<<" "<<item.revenue<<" "<<item.avg_price();
	return os;
}
Sales_data add(const Sales_data &lhs,const Sales_data &rhs)
{
	Sales_data sum=lhs;
	sum.combine(rhs);
	return sum;
}
int main(void)
{
	Sales_data a;
	print(cout,a)<<endl;
	Sales_data b("1992");
	print(cout,b)<<endl;
	Sales_data c{"1992",1,20};
	print(cout,c)<<endl;
	Sales_data d{cin};
	print(cout,d)<<endl;
	return 0;
}

7.13

#include <iostream>
#include <string>
using namespace std;
struct Sales_data;
istream &read(istream &is,Sales_data &item);
struct Sales_data
{
	string bookNo;
	unsigned units_sold=0;
	double revenue=0.0;
	std::string isbn() const  {return bookNo;}
	Sales_data &combine(const Sales_data &);
	double avg_price() const;
	Sales_data()=default;
	Sales_data(istream &is){read(is,*this);}
	Sales_data(const string &s):bookNo(s){}
	Sales_data(const string &s,unsigned n,double p):bookNo(s),units_sold{n},revenue{n*p}{}
};
double Sales_data::avg_price() const
{
	if(units_sold)
		return revenue/units_sold;
	else
		return 0;
}
Sales_data & Sales_data::combine(const Sales_data &rhs)
{
	units_sold+=rhs.units_sold;
	revenue+=rhs.revenue;
	return *this;
}
istream &read(istream &is,Sales_data &item)
{
	double price=0;
	is>>item.bookNo>>item.units_sold>>price;
	item.revenue=item.units_sold*price;
	return is;
}
ostream &print(ostream &os,Sales_data &item)
{
	os<<item.isbn()<<" "<<item.units_sold<<" "<<item.revenue<<" "<<item.avg_price();
	return os;
}
Sales_data add(const Sales_data &lhs,const Sales_data &rhs)
{
	Sales_data sum=lhs;
	sum.combine(rhs);
	return sum;
}
int main(void)
{
	Sales_data total{cin};
	Sales_data trans;
	while(read(cin,trans))
	{
		if(total.isbn()==trans.isbn())
			total.combine(trans);
		else
		{
			print(cout,total)<<endl;
			total=trans;
		}
	}
	print(cout,total)<<endl;
	return 0;
}

7.14

Sales_data(const string &s):bookNo(s),units_sold{0},revenue{0.0}{}

7.15

#include <iostream>
#include <string>
struct Person
{
	std::string name;
	std::string address;
	std::string getName() const { return name; }
	std::string getAddress const { return address; }
	Person()=default;
	Person(const std::string &s):name(s){}
	Person(const std::string &s1,const std::string &s2):name{s1},address{s2}{}
	Person(std::istream &is);
};
istream & read(istream &is,Person &rp)
{
	is>>rp.name>>rp.address;
	return is;
}
ostream & print(ostream &os,Person &rp)
{
	os<<rp.getName()<<" "<<rp.getAddress();
	return os;
}
Person::Person(std::istream &is)
{
	read(is,*this);
}

7.16

??沒(méi)有限制,需要在整個(gè)程序內(nèi)可被訪問(wèn)的接口部分定義在public后,實(shí)現(xiàn)細(xì)節(jié)定義在private后。

7.17

??classstruct的區(qū)別僅僅在于默認(rèn)訪問(wèn)權(quán)限,class的默認(rèn)訪問(wèn)權(quán)限是private的,而struct的默認(rèn)訪問(wèn)權(quán)限是public的。

7.18

??封裝實(shí)現(xiàn)了類(lèi)的接口和實(shí)現(xiàn)分離

7.19

??數(shù)據(jù)成員聲明成private的,構(gòu)造函數(shù)與接口函數(shù)聲明成public的。

7.20

??友元的用處在于非類(lèi)的成員的其它類(lèi)或函數(shù)要訪問(wèn)類(lèi)的非公有成員時(shí)。

7.21

#include <iostream>
#include <string>
using namespace std;
class Sales_data;
istream &read(istream &is,Sales_data &item);
class Sales_data
{
friend Sales_data add(const Sales_data &lhs,const Sales_data &rhs);
friend ostream &print(ostream &os,Sales_data &item);
friend istream &read(istream &is,Sales_data &item);
private:
	string bookNo;
	unsigned units_sold=0;
	double revenue=0.0;
	double avg_price() const;
public:
	std::string isbn() const  {return bookNo;}
	Sales_data &combine(const Sales_data &);
	Sales_data()=default;
	Sales_data(istream &is){read(is,*this);}
	Sales_data(const string &s):bookNo(s){}
	Sales_data(const string &s,unsigned n,double p):bookNo(s),units_sold{n},revenue{n*p}{}
};
double Sales_data::avg_price() const
{
	if(units_sold)
		return revenue/units_sold;
	else
		return 0;
}
Sales_data & Sales_data::combine(const Sales_data &rhs)
{
	units_sold+=rhs.units_sold;
	revenue+=rhs.revenue;
	return *this;
}
istream &read(istream &is,Sales_data &item)
{
	double price=0;
	is>>item.bookNo>>item.units_sold>>price;
	item.revenue=item.units_sold*price;
	return is;
}
ostream &print(ostream &os,Sales_data &item)
{
	os<<item.isbn()<<" "<<item.units_sold<<" "<<item.revenue<<" "<<item.avg_price();
	return os;
}
Sales_data add(const Sales_data &lhs,const Sales_data &rhs)
{
	Sales_data sum=lhs;
	sum.combine(rhs);
	return sum;
}
int main(void)
{
	Sales_data total{cin};
	Sales_data trans;
	while(read(cin,trans))
	{
		if(total.isbn()==trans.isbn())
			total.combine(trans);
		else
		{
			print(cout,total)<<endl;
			total=trans;
		}
	}
	print(cout,total)<<endl;
	return 0;
}

7.22

#include <iostream>
#include <string>
class Person
{
	friend std::istream & read(std::istream &is,Person &rp);
	friend std::ostream & print(std::ostream &os,const Person &rp);
private:
	std::string name;
	std::string address;
public:
	std::string getName() const { return name; }
	std::string getAddress const { return address; }
	Person()=default;
	Person(const std::string &s):name(s){}
	Person(const std::string &s1,const std::string &s2):name{s1},address{s2}{}
	Person(std::istream &is);
};
std::istream & read(std::istream &is,Person &rp)
{
	is>>rp.name>>rp.address;
	return is;
}
std::ostream & print(std::ostream &os,const Person &rp)
{
	os<<rp.getName()<<" "<<rp.getAddress();
	return os;
}
Person::Person(std::istream &is)
{
	read(is,*this);
}

7.23

#include <string>
class Screen
{
	pubilic:
		using pos=std::string::size_type pos;
		Screen()=default;
		Screen(pos ht,pos wd,char c):height{ht},width{wd},contents(ht*wd,c){}
		char get() const {return contents[cursor];}
		char get(pos r,pos c) const;
		Screen &move(pos r,pos c);
	private:
		pos cursor=0,height=0,width=0;
		std::string contents;
};
inline char Screen::get(pos r,pos c) const
{
	pos row=r*width;
	return contents[row+c];
}
inline Screen &move(pos r,pos c)
{
	pos row=r*width;
	cursor=row+c;
	return *this;
}

7.24

#include <string>
class Screen
{
	pubilic:
		using pos=std::string::size_type pos;
		Screen()=default;
		Screen(pos ht,pos wd):height{ht},width{wd},contents(ht*wd,' '){}
		Screen(pos ht,pos wd,char c):height{ht},width{wd},contents(ht*wd,c){}
		char get() const {return contents[cursor];}
		char get(pos r,pos c) const;
		Screen &move(pos r,pos c);
	private:
		pos cursor=0,height=0,width=0;
		std::string contents;
};
inline char Screen::get(pos r,pos c) const
{
	pos row=r*width;
	return contents[row+c];
}
inline Screen &move(pos r,pos c)
{
	pos row=r*width;
	cursor=row+c;
	return *this;
}

7.25

??能,因?yàn)?code>Screen的數(shù)據(jù)成員只有內(nèi)置類(lèi)型string類(lèi)型,而string類(lèi)型有自己的拷貝和賦值操作,所以可以依賴于拷貝和賦值操作的默認(rèn)合成版本。

7.26

#include <iostream>
#include <string>
using namespace std;
class Sales_data;
istream &read(istream &is,Sales_data &item);
class Sales_data
{
friend Sales_data add(const Sales_data &lhs,const Sales_data &rhs);
friend ostream &print(ostream &os,Sales_data &item);
friend istream &read(istream &is,Sales_data &item);
private:
	string bookNo;
	unsigned units_sold=0;
	double revenue=0.0;
	double avg_price() const;
public:
	std::string isbn() const  {return bookNo;}
	Sales_data &combine(const Sales_data &);
	Sales_data()=default;
	Sales_data(istream &is){read(is,*this);}
	Sales_data(const string &s):bookNo(s){}
	Sales_data(const string &s,unsigned n,double p):bookNo(s),units_sold{n},revenue{n*p}{}
};
inline double Sales_data::avg_price() const
{
	if(units_sold)
		return revenue/units_sold;
	else
		return 0;
}
Sales_data & Sales_data::combine(const Sales_data &rhs)
{
	units_sold+=rhs.units_sold;
	revenue+=rhs.revenue;
	return *this;
}
istream &read(istream &is,Sales_data &item)
{
	double price=0;
	is>>item.bookNo>>item.units_sold>>price;
	item.revenue=item.units_sold*price;
	return is;
}
ostream &print(ostream &os,Sales_data &item)
{
	os<<item.isbn()<<" "<<item.units_sold<<" "<<item.revenue<<" "<<item.avg_price();
	return os;
}
Sales_data add(const Sales_data &lhs,const Sales_data &rhs)
{
	Sales_data sum=lhs;
	sum.combine(rhs);
	return sum;
}
int main(void)
{
	Sales_data total{cin};
	Sales_data trans;
	while(read(cin,trans))
	{
		if(total.isbn()==trans.isbn())
			total.combine(trans);
		else
		{
			print(cout,total)<<endl;
			total=trans;
		}
	}
	print(cout,total)<<endl;
	return 0;
}

7.27

page246.h

#include <string>
class Screen
{
	public:
		using pos=std::string::size_type;
		Screen()=default;
		Screen(pos ht,pos wd):height{ht},width{wd},contents(ht*wd,' '){}
		Screen(pos ht,pos wd,char c):height{ht},width{wd},contents(ht*wd,c){}
		char get() const {return contents[cursor];}
		char get(pos r,pos c) const;
		Screen &move(pos r,pos c);
		Screen &set(char);
		Screen &set(pos,pos,char);
		Screen &display(std::ostream &os){do_display(os);return *this;}
		const Screen &display(std::ostream &os) const {do_display(os);return *this;}
	private:
		pos cursor=0,height=0,width=0;
		std::string contents;
		void  do_display(std::ostream &os) const {os<<contents;}
};
inline char Screen::get(pos r,pos c) const
{
	pos row=r*width;
	return contents[row+c];
}
inline Screen &Screen::move(pos r,pos c)
{
	pos row=r*width;
	cursor=row+c;
	return *this;
}
inline Screen &Screen::set(char ch)
{
	contents[cursor]=ch;
	return *this;
}
inline Screen &Screen::set(pos r,pos c,char ch)
{
	contents[r*width+c]=ch;
	return *this;
}
#include <iostream>
#include "page246.h"
using namespace std;
int main()
{
	Screen myScreen(5,5,'X');
	myScreen.move(4,0).set('#').display(cout);
	cout<<"\n";
	myScreen.display(cout);
	cout<<'\n';
	return 0;
}

7.28

??這樣的話,只有move(4,0)會(huì)對(duì)Screen生效,另外的函數(shù)將操作一個(gè)臨時(shí)的副本。

7.29

待完善

7.30

??可以明確的表示訪問(wèn)的對(duì)象的成員,并且可以在成員函數(shù)中使用與數(shù)據(jù)成員同名的形參,缺點(diǎn)是太繁瑣。

7.31

class Y;
class X
{
	Y *py;
};
class Y
{
	X obj;
};

7.32

#include <string>
class Window_mgr
{
	public:
		using ScreenIndex=std::vector<Screen>::size_type;
		void clear(ScreenIndex i);
		ScreenIndex addScreen(const Screen &);
	private:
		std::vector<Screen> screens{Screen(24,80,' ')};
}
inline Window_mgr::ScreenIndex Window_mgr::addScreen(const Screen &s)
{
	screens.push_back(s);
	return screens.size()-1;
}
class Screen
{
	friend void Window_mgr::clear(ScreenIndex i);
	public:
		using pos=std::string::size_type;
		Screen()=default;
		Screen(pos ht,pos wd):height{ht},width{wd},contents(ht*wd,' '){}
		Screen(pos ht,pos wd,char c):height{ht},width{wd},contents(ht*wd,c){}
		char get() const {return contents[cursor];}
		char get(pos r,pos c) const;
		Screen &move(pos r,pos c);
		Screen &set(char);
		Screen &set(pos,pos,char);
		Screen &display(std::ostream &os){do_display(os);return *this;}
		const Screen &display(std::ostream &os) const {do_display(os);return *this;}
	private:
		pos cursor=0,height=0,width=0;
		std::string contents;
		void  do_display(std::ostream &os) const {os<<contents;}
};
inline char Screen::get(pos r,pos c) const
{
	pos row=r*width;
	return contents[row+c];
}
inline Screen &Screen::move(pos r,pos c)
{
	pos row=r*width;
	cursor=row+c;
	return *this;
}
inline Screen &Screen::set(char ch)
{
	contents[cursor]=ch;
	return *this;
}
inline Screen &Screen::set(pos r,pos c,char ch)
{
	contents[r*width+c]=ch;
	return *this;
}
inline void Window_mgr::clear(ScreenIndex i)
{
	Screen &s=screens[i];
	s.contents=string(s.height*s.width,' ');
}

7.33

??pos類(lèi)型定義在類(lèi)的內(nèi)部,需要使用作用域說(shuō)明符。

Screen::pos Screen::size() const
{
    return height*width;
}

7.34

??對(duì)pos的使用將出現(xiàn)在它的聲明之前,編譯錯(cuò)誤。

7.35

typedef string Type;
Type initVal();
class Exercise{
    public:
        typedef double Type;
        Type setVal(Type);//此時(shí)的Type都是double
        Type initVal();//此時(shí)的Type都是double
    private:
        int val;
};
Exercise::Type Exercise::setVal(Type parm){//此行的第一個(gè)Type應(yīng)該指明所屬的類(lèi)
    val=parm+initVal();
    return val;
}

7.36

??成員的初始化順序與他們在類(lèi)定義中的出現(xiàn)順序一致,所以這里會(huì)先初始化rem,但是在構(gòu)造函數(shù)的初始值列表中,用來(lái)初始化rem的數(shù)值存在base,而此時(shí)base還未初始化。

struct X {
    X (int i,int j):base(i),rem(i%j) {}
    int rem,base;
};

7.37

Sales_data first_item(cin);//Sales_data(std::istream &is);數(shù)據(jù)成員的值依賴于輸入
int main(){
    Sales_data next;//Sales_data(std::string s="");bookNo默認(rèn)初始化為空字符串,其余數(shù)據(jù)成員使用類(lèi)內(nèi)初始值值初始化為0.
    Sales_data last("9-999-99999-9");//Sales_data(const std::string &);bookNo初始化為9-999-99999-9,其余數(shù)據(jù)成員使用類(lèi)內(nèi)初始值初始化為0.
}

7.38

Sales_data(std::istream &is=std::cin);

7.39

??不合法,兩個(gè)函數(shù)都具有了默認(rèn)構(gòu)造函數(shù)的作用,會(huì)產(chǎn)生二義性錯(cuò)誤。

7.40

class Employee
{
public:
	Employee()=default;
	Employee(std::string s):name(s){}
	Employee(std::string s,unsigned int i,double j,unsigned int k):name(s),Age(i),salary(j),Phone_Number(k){}
private:
	std::string name;
	unsigned int Age=0;
	double salary=0;
	unsigned int Phone_Number=0;
}

7.41

#include <iostream>
#include <string>
using namespace std;
class Sales_data;
istream &read(istream &is,Sales_data &item);
class Sales_data
{
friend Sales_data add(const Sales_data &lhs,const Sales_data &rhs);
friend ostream &print(ostream &os,Sales_data &item);
friend istream &read(istream &is,Sales_data &item);
private:
	string bookNo;
	unsigned units_sold=0;
	double revenue=0.0;
	double avg_price() const;
public:
	std::string isbn() const  {return bookNo;}
	Sales_data &combine(const Sales_data &);
	Sales_data():Sales_data("",0,0){std::cout<<"This is the default constructor."<<endl;}
	Sales_data(istream &is):Sales_data(){read(is,*this);cout<<"This is the iostream constructor."<<endl;}
	Sales_data(const string &s):Sales_data(s,0,0){cout<<"This is the single string constructor."<<endl;}
	Sales_data(const string &s,unsigned n,double p):bookNo(s),units_sold{n},revenue{n*p}{cout<<"This is the three parameter constructor."<<endl;}
};
inline double Sales_data::avg_price() const
{
	if(units_sold)
		return revenue/units_sold;
	else
		return 0;
}
Sales_data & Sales_data::combine(const Sales_data &rhs)
{
	units_sold+=rhs.units_sold;
	revenue+=rhs.revenue;
	return *this;
}
istream &read(istream &is,Sales_data &item)
{
	double price=0;
	is>>item.bookNo>>item.units_sold>>price;
	item.revenue=item.units_sold*price;
	return is;
}
ostream &print(ostream &os,Sales_data &item)
{
	os<<item.isbn()<<" "<<item.units_sold<<" "<<item.revenue<<" "<<item.avg_price();
	return os;
}
Sales_data add(const Sales_data &lhs,const Sales_data &rhs)
{
	Sales_data sum=lhs;
	sum.combine(rhs);
	return sum;
}
int main(void)
{
	Sales_data a;
	Sales_data b{"hi"};
	Sales_data c{"hi",1,1};
	Sales_data d{cin};
	return 0;
}

7.42

class Employee
{
public:
	Employee():Employee("",0,0,0){}
	Employee(std::string s):Employee(s,0,0,0){}
	Employee(std::string s,unsigned int i,double j,unsigned int k):name(s),Age(i),salary(j),Phone_Number(k){}
private:
	std::string name;
	unsigned int Age=0;
	double salary=0;
	unsigned int Phone_Number=0;
}

7.43

class NoDefault
{
public:
	val v;
	NoDefault(int i):val(i){}
};
class C
{
public:
	NoDefault no;
	C(int i=0):no(i){}
};

7.44

??不合法,NoDefault類(lèi)沒(méi)有默認(rèn)構(gòu)造函數(shù),無(wú)法默認(rèn)初始化vector的元素。

7.45

??合法,C默認(rèn)構(gòu)造函數(shù)。

7.46

  1. 錯(cuò)誤,可以依賴合成的默認(rèn)構(gòu)造函數(shù)
  2. 錯(cuò)誤,可以帶有默認(rèn)實(shí)參
  3. 錯(cuò)誤,因?yàn)槿绻粋€(gè)類(lèi)沒(méi)有默認(rèn)構(gòu)造函數(shù),也就是說(shuō)我們定義了該類(lèi)的某些構(gòu)造函數(shù)但是沒(méi)有為其設(shè)計(jì)默認(rèn)構(gòu)造函數(shù),則當(dāng)編譯器確實(shí)需要隱式地使用默認(rèn)構(gòu)造函數(shù)時(shí),該類(lèi)無(wú)法使用。所以一般情況下,都應(yīng)該為類(lèi)構(gòu)建一個(gè)默認(rèn)構(gòu)造函數(shù)
  4. 錯(cuò)誤,類(lèi)類(lèi)型成員執(zhí)行各自的默認(rèn)構(gòu)造函數(shù),內(nèi)置類(lèi)型和復(fù)合類(lèi)型的成員只對(duì)定義在全局作用域中的對(duì)象執(zhí)行初始化

7.47

??設(shè)為explicit可以避免誤將string對(duì)象轉(zhuǎn)換為Sales_data。

7.48

string null_isbn("9-999-99999-9");
Sales_data item1(null_isbn);//由null_isbn轉(zhuǎn)換一個(gè)Sales_data臨時(shí)量用于初始化item1
Sales_data item2("9-999-99999-9");//錯(cuò)誤,只允許一步類(lèi)類(lèi)型轉(zhuǎn)換,這種情況必須顯示調(diào)用構(gòu)造函數(shù)

7.49

  1. 值傳遞,string生成Sales_data臨時(shí)量
  2. 錯(cuò)誤,臨時(shí)量無(wú)法賦予非常量引用
  3. 可以調(diào)用,但此函數(shù)是常量成員函數(shù),無(wú)法改變調(diào)用的對(duì)象,所以無(wú)法達(dá)到調(diào)用目的

7.50

#include <iostream>
#include <string>
class Person
{
	friend std::istream & read(std::istream &is,Person &rp);
	friend std::ostream & print(std::ostream &os,const Person &rp);
private:
	std::string name;
	std::string address;
public:
	std::string getName() const { return name; }
	std::string getAddress const { return address; }
	Person()=default;
	explicit Person(const std::string &s):name(s){}
	Person(const std::string &s1,const std::string &s2):name{s1},address{s2}{}
	explicit Person(std::istream &is);
};
std::istream & read(std::istream &is,Person &rp)
{
	is>>rp.name>>rp.address;
	return is;
}
std::ostream & print(std::ostream &os,const Person &rp)
{
	os<<rp.getName()<<" "<<rp.getAddress();
	return os;
}
Person::Person(std::istream &is)
{
	read(is,*this);
}

7.51

??例如將一個(gè)int值轉(zhuǎn)換成vector,意義不明確。

7.52

??這里程序的意圖是提供一個(gè)花括號(hào)括起來(lái)的成員初始值列表對(duì)item進(jìn)行初始化,但是這要求item是聚合類(lèi),所以應(yīng)該去掉Sales_data類(lèi)的類(lèi)內(nèi)初始值

7.53

class Debug
{
public:
	constexpr Debug(bool b=true):hw(b),io(b),other(b){}
	constexpr Debug(bool h,bool i,bool o):hw(h),io(i),other(o){}
	constexpr bool any(){return hw||io||other;}
	void set_hw(bool b){hw=b;}
	void set_io(bool b){io=b;}
	void set_other(bool b){other=b;}
private:
	bool hw;
	bool io;
	bool other;
};

7.54

??不能,這些函數(shù)用于設(shè)置數(shù)據(jù)成員的值,而constexpr函數(shù)成員是隱式const的。

7.55

不是,它雖然是聚合類(lèi),但它的數(shù)據(jù)成員s不是字面值類(lèi)型

7.56

??靜態(tài)成員是指聲明語(yǔ)句之前帶有關(guān)鍵字static的類(lèi)成員,靜態(tài)成員不是任意單獨(dú)對(duì)象的組成部分,而是由該類(lèi)的全體對(duì)象所共享。
靜態(tài)成員的優(yōu)點(diǎn)包括:作用域位于類(lèi)的范圍之內(nèi),避免與其他類(lèi)的成員或者全局作用域的名字沖突;可以是私有成員;通過(guò)閱讀程序可以非常容易地看出靜態(tài)成員與特定類(lèi)關(guān)聯(lián),使得程序的含義清晰明了。
靜態(tài)成員與普通成員的區(qū)別主要體現(xiàn)在:普通成員與類(lèi)的對(duì)象關(guān)聯(lián),是某個(gè)具體對(duì)象的組成部分;而靜態(tài)成員不從屬于任何具體的對(duì)象,它由該類(lèi)的所有對(duì)象共享。另外,還有一個(gè)細(xì)微的區(qū)別,靜態(tài)成員可以作為默認(rèn)實(shí)參,而普通數(shù)據(jù)成員不能作為默認(rèn)實(shí)參。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-837526.html

7.57

class Account
{
public:
	void calculate(){amount+=amount*interestRate;}
	static double rate(){return interestRate;}
	static void rate(double);
private:
	std::string owner;
	double amount;
	static double interestRate;
	static double initRate();
};
void Account::rate(double newRate)
{
	interestRate=newRate;
}
double Account::initRate()
{
	return 0.0;
}
double Account::interestRate=initRate();

7.58

class Example
{
public:
	static double rate;
	static constexpr int vecSize=20;
	static vector<double> vec;
};
double Example::rate=6.5;
constexpr int Example::vecSize;
vector<double> Example::vec(vecSize);

到了這里,關(guān)于c++ primer中文版第五版作業(yè)第七章的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C Primer Plus (中文版)第10章編程練習(xí) 參考答案(僅供參考~)

    ?? C Primer Plus第10章編程練習(xí)~ 加油加油!?? ??歡迎大家討論 批評(píng)指正~ ??1.修改程序清單10.7的rain.c程序,用指針進(jìn)行計(jì)算(仍然要聲明并初始化數(shù)組)。計(jì)算每年的總降水量、年平均降水量和5年中每月的平均降水量 ??編寫(xiě)一個(gè)程序,初始化一個(gè)double類(lèi)型的數(shù)組,然后把

    2024年02月04日
    瀏覽(18)
  • C++標(biāo)準(zhǔn)庫(kù) -- 順序容器 (Primer C++ 第五版 · 閱讀筆記)

    C++標(biāo)準(zhǔn)庫(kù) -- 順序容器 (Primer C++ 第五版 · 閱讀筆記)

    所有容器類(lèi)都共享公共的接口,不同容器按不同方式對(duì)其進(jìn)行擴(kuò)展。 這個(gè)公共接口使容器的學(xué)習(xí)更加容易—我們基于某種容器所學(xué)習(xí)的內(nèi)容也都適用于其他容器。 每種容器都提供了不同的性能和功能的權(quán)衡。 下表列出了標(biāo)準(zhǔn)庫(kù)中的順序容器, 所有順序容器都提供了 快速順序

    2023年04月17日
    瀏覽(25)
  • C++標(biāo)準(zhǔn)庫(kù) -- 泛型算法 (Primer C++ 第五版 · 閱讀筆記)

    C++標(biāo)準(zhǔn)庫(kù) -- 泛型算法 (Primer C++ 第五版 · 閱讀筆記)

    順序容器只定義了很少的操作:在多數(shù)情況下,我們可以添加和刪除元素訪問(wèn)首尾元素、確定容器是否為空以及獲得指向首元素或尾元素之后位置的迭代器。 我們可以想象用戶可能還希望做其他很多有用的操作:查找特定元素、替換或刪除一個(gè)特定值、重排元素順序等。 標(biāo)準(zhǔn)庫(kù)

    2023年04月21日
    瀏覽(27)
  • C++ Primer第五版_第九章習(xí)題答案(51~52)

    練習(xí)9.51 設(shè)計(jì)一個(gè)類(lèi),它有三個(gè)unsigned成員,分別表示年、月和日。為其編寫(xiě)構(gòu)造函數(shù),接受一個(gè)表示日期的string參數(shù)。你的構(gòu)造函數(shù)應(yīng)該能處理不同的數(shù)據(jù)格式,如January 1,1900、1/1/1990、Jan 1 1900 等。

    2023年04月11日
    瀏覽(25)
  • C++ Primer第五版_第十四章習(xí)題答案(41~50)

    練習(xí)14.41 你認(rèn)為 C++ 11 標(biāo)準(zhǔn)為什么要增加 lambda?對(duì)于你自己來(lái)說(shuō),什么情況下會(huì)使用 lambda,什么情況下會(huì)使用類(lèi)? 使用 lambda 是非常方便的,當(dāng)需要使用一個(gè)函數(shù),而這

    2024年02月01日
    瀏覽(29)
  • C++ Primer第五版_第十六章習(xí)題答案(41~50)

    練習(xí)16.41 編寫(xiě)一個(gè)新的 sum 版本,它返回類(lèi)型保證足夠大,足以容納加法結(jié)果。 練習(xí)16.42 對(duì)下面每個(gè)調(diào)用,確定 T 和 val

    2024年02月04日
    瀏覽(26)
  • C++ Primer第五版_第十六章習(xí)題答案(51~60)

    練習(xí)16.51 調(diào)用本節(jié)中的每個(gè) foo,確定 sizeof…(Args) 和 sizeof…(rest)分別返回什么。 練習(xí)16.52 編寫(xiě)一個(gè)程序驗(yàn)證上一題的答案。 練習(xí)16.53 編寫(xiě)你自己版本的 print 函數(shù),并打印一個(gè)、兩個(gè)及五個(gè)實(shí)參來(lái)測(cè)試它,要打印的每個(gè)實(shí)參都應(yīng)有不同的

    2024年02月05日
    瀏覽(28)
  • C++ Primer第五版_第十八章習(xí)題答案(11~20)

    練習(xí)18.11 為什么 what 函數(shù)不應(yīng)該拋出異常? what中如果拋出異常,需要try catch捕獲,再調(diào)用what,一直循環(huán),直達(dá)內(nèi)存耗盡。 練習(xí)18.12 將你為之前各章練習(xí)編寫(xiě)的程序放置在各自的命名空間中。也就是說(shuō),命名空間chapter15包含Query程序的代碼,命名空間chapter10包含TextQuery的代碼

    2024年02月06日
    瀏覽(23)
  • 《Effective C++中文版,第三版》讀書(shū)筆記7

    隱式接口: ? 僅僅由一組有效表達(dá)式構(gòu)成,表達(dá)式自身可能看起來(lái)很復(fù)雜,但它們要求的約束條件一般而言相當(dāng)直接而明確。 顯式接口: ? 通常由函數(shù)的簽名式(也就是函數(shù)名稱(chēng)、參數(shù)類(lèi)型、返回類(lèi)型)構(gòu)成 ? 在源碼中明確可見(jiàn)。 編譯期多態(tài): 在編譯時(shí)才能確定具體調(diào)

    2024年02月09日
    瀏覽(55)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包