(1)class与
- /*
- 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 不能。
- */
(2)7_1
struct sales_data{ string name; unsigned cnt; double price; }; int main () { sales_data total; cout<<"请输入total"<<endl; if (cin>>total.name>>total.cnt>>total.price) { cout<<total.name<<" "<<total.cnt<<" "<<total.price<<" "<<endl; sales_data trans; cout<<"请输入trans"<<endl; while (cin>>trans.name>>trans.cnt>>trans.price) { cout<<trans.name<<" "<<trans.cnt<<" "<<trans.price<<" "<<endl; if (total.name==trans.name) { total.cnt+=trans.cnt; } else { cout<<"total.cnt*total.price"<<total.cnt*total.price<<endl; total=trans; } } } else { cerr<<"No data?"<<endl; return -1; } system("pause"); return 0; }
(3)7_2&7_3答案
struct sales_data{ public: string name; unsigned cnt; double totalprice; string isbn() const{return name;} sales_data & combine(const sales_data &rhs); private: protected: }; sales_data & sales_data::combine(const sales_data &rhs) { cnt+=rhs.cnt; totalprice+=rhs.totalprice; return *this; } int main () { sales_data total; cout<<"请输入total"<<endl; if (cin>>total.name>>total.cnt>>total.totalprice) { cout<<total.name<<" "<<total.cnt<<" "<<total.totalprice<<" "<<endl; sales_data trans; cout<<"请输入trans"<<endl; sales_data sum; sum=total; unsigned CNT=total.cnt; double TOTALPRICE=total.totalprice; while (cin>>trans.name>>trans.cnt>>trans.totalprice) { cout<<trans.name<<" "<<trans.cnt<<" "<<trans.totalprice<<" "<<endl; if (total.isbn()==trans.isbn()) { sum=total.combine(trans);//需要定义一个sales_data对象来引用cnt和totalprice,用total.combine(trans)直接引用不对 CNT=sum.cnt; TOTALPRICE=sum.totalprice; } else { cout<<"CNT"<<CNT<<"TOTALPRICE"<<TOTALPRICE<<endl; total=trans; } } } else { cerr<<"No data?"<<endl; return -1; } system("pause"); return 0; }
(4) 7_9答案
//7_9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% class person { public: string name; string addr; string isname() const{return name;} string isaddr() const{return addr;} }; istream & read(istream &is,person &per) { is>>per.name>>per.addr;//s>>per.name>>"">>per.addr;中间不能加""空格。 return is; } ostream & print(ostream &os,const person &per) { os<<per.name<<per.addr;//os中间可以加空格。为什么? return os; } int main () { person per1,per2; //read(cin,per2); if(read(read(cin,per2),per1)); print(cout,per1); print(cout,per2); system("pause"); return 0; }
(5)7_11答案
struct sales_data{ sales_data(){}; sales_data(const string &s):name(s){} sales_data(const string &s,unsigned n,double m):name(s),cnt(n),totalprice(m){} sales_data::sales_data(istream &is) { read(is,*this); } string name; unsigned cnt; double totalprice; string isbn() const{return name;} sales_data & combine(const sales_data &rhs); istream &read(istream &is,sales_data &item); ostream &print(ostream &os,const sales_data &item); public: private: protected: }; sales_data & sales_data::combine(const sales_data &rhs) { cnt+=rhs.cnt; totalprice+=rhs.totalprice; return *this; } istream &sales_data::read(istream &is,sales_data &item) { is>>item.name>>item.cnt>>item.totalprice; return is; } ostream &sales_data::print(ostream &os,const sales_data &item) { os<<item.name<<" "<<item.cnt<<" "<<item.totalprice; return os; } sales_data add(const sales_data &lhs,const sales_data &rhs) { sales_data sum=lhs; sum.combine(rhs); return sum; } int main () { sales_data total; sales_data total1("wo"); sales_data total2("wo",2,3); sales_data total3(cin); total.print(cout,total); cout<<endl; total1.print(cout,total1); cout<<endl; total2.print(cout,total2); cout<<endl; total3.print(cout,total3); cout<<endl; system("pause"); return 0; }(6) 7_13答案
struct sales_data{ sales_data(){}; sales_data(const string &s):name(s){} sales_data(const string &s,unsigned n,double m):name(s),cnt(n),totalprice(m){} sales_data::sales_data(istream &is); string name; unsigned cnt; double totalprice; string isbn() const{return name;} sales_data & combine(const sales_data &rhs); public: private: protected: }; sales_data add(const sales_data &lhs,const sales_data &rhs); istream &read(istream &is,sales_data &item); ostream &print(ostream &os,const sales_data &item); sales_data & sales_data::combine(const sales_data &rhs) { cnt+=rhs.cnt; totalprice+=rhs.totalprice; return *this; } istream &read(istream &is,sales_data &item) { is>>item.name>>item.cnt>>item.totalprice; return is; } ostream &print(ostream &os,const sales_data &item) { os<<item.name<<" "<<item.cnt<<" "<<item.totalprice; 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 () { sales_data total(cin); cout<<"请输入total"<<endl; if (cin) { print(cout,total); sales_data trans; cout<<"请输入trans"<<endl; sales_data sum; sum=total; unsigned CNT=total.cnt; double TOTALPRICE=total.totalprice; while (read(cin,trans))//第二个读取操作不能用istream初始化构造函数,why? { print(cout,trans);; if (total.isbn()==trans.isbn()) { sum=total.combine(trans);//需要定义一个sales_data对象来引用cnt和totalprice,用total.combine(trans)直接引用不对 CNT=sum.cnt; TOTALPRICE=sum.totalprice; } else { cout<<"CNT"<<CNT<<"TOTALPRICE"<<TOTALPRICE<<endl; total=trans; } } } else { cerr<<"No data?"<<endl; return -1; } system("pause"); return 0; }
(7)7_21答案
struct sales_data{ friend sales_data add(const sales_data &,const sales_data &); friend istream & read(istream &is,sales_data &item); friend ostream &print(ostream &os,const sales_data &item); public: sales_data(){}; sales_data(const string &s):name(s){} sales_data(const string &s,unsigned n,double m):name(s),cnt(n),totalprice(m){} sales_data::sales_data(istream &is); string isbn() const{return name;} sales_data & combine(const sales_data &rhs); private: string name; unsigned cnt; double totalprice; protected: }; sales_data add(const sales_data &lhs,const sales_data &rhs); istream &read(istream &is,sales_data &item); ostream &print(ostream &os,const sales_data &item); sales_data & sales_data::combine(const sales_data &rhs) { cnt+=rhs.cnt; totalprice+=rhs.totalprice; return *this; } istream &read(istream &is,sales_data &item) { is>>item.name>>item.cnt>>item.totalprice; return is; } ostream &print(ostream &os,const sales_data &item) { os<<item.name<<" "<<item.cnt<<" "<<item.totalprice; 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 () { cout<<"请输入total"<<endl; sales_data total(cin); if (cin) { print(cout,total); sales_data trans; cout<<"请输入trans"<<endl; while (read(cin,trans))//第二个读取操作不能用istream初始化构造函数,why? { print(cout,trans);; if (total.isbn()==trans.isbn()) { total.combine(trans);//需要定义一个sales_data对象来引用cnt和totalprice,用total.combine(trans)直接引用不对 } else { print(cout,total); total=trans; } } } else { cerr<<"No data?"<<endl; return -1; } system("pause"); return 0; }
(8)7_27答案
class screen { public: typedef string::size_type pos; screen(){} //screen (char c=' ', pos ht=0,pos wh=0,pos cur=0):height(ht),width(wh),cursor(cur),contents(ht*wh,c){} screen(char c,pos ht=0,pos wh=0,pos cur=0):height(ht),width(wh),cursor(cur),contents(ht*wh,c){} char get ()const; char get (pos ht,pos wd)const; screen &move(pos r ,pos c); void some_member ()const; screen &set (char); screen &set (pos,pos,char); screen &display(ostream &os){do_display(os);return *this;} const screen &display(ostream &os) const {do_display(os);return *this;}//第二个const有待进一步理解 private: pos cursor; pos height,width; string contents; mutable size_t access_ctr; void do_display (ostream &os )const {os<<contents;} }; inline screen & screen::move(pos r ,pos c) { pos row=r*width; cursor=row+c; return *this; } inline char screen::get(pos r ,pos c)const { pos row=r*width; return contents[row+c]; } inline char screen::get()const { return contents[cursor]; } void screen::some_member ()const { ++access_ctr; } inline screen& screen::set(char c) { contents[cursor]=c; return *this; } inline screen& screen::set(pos r,pos col ,char c) { contents[r*width+col]=c; return *this; } int main() { screen myscreen('X',5,5); myscreen.move(4,0).set('#').display(cout); cout<<"\n"; myscreen.display(cout); cout<<"\n"; system("pause"); return 0; }