倉(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
??class
和struct
的區(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
- 錯(cuò)誤,可以依賴合成的默認(rèn)構(gòu)造函數(shù)
- 錯(cuò)誤,可以帶有默認(rèn)實(shí)參
- 錯(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ù)
- 錯(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
- 值傳遞,
string
生成Sales_data
臨時(shí)量 - 錯(cuò)誤,臨時(shí)量無(wú)法賦予非常量引用
- 可以調(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)型。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-837526.html
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)!