#include<iostream>
#include<string>
using namespace std;
struct Sales_data //类
{
//新成员
string isbn() const { return bookNo; }//ISBN编号
Sales_data& combine(const Sales_data&);//将Sales_data对象加到另一个对象上
double avg_price() const;
//数据成员
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
//在类的外部定义成员函数
double Sales_data::avg_price()const
{
if (units_sold) return revenue / units_sold;
else return 0;
}
//定义一个返回this的对象函数
Sales_data& Sales_data::combine(const Sales_data& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return* this;
}
//Sales_data非成员接口函数
Sales_data add(const Sales_data & lhs, const Sales_data& rhs)//执行两个Sales_data对象加法
{
Sales_data sum = lhs;//lsh的数据成员拷贝给sum
sum.combine(rhs);//lsh的数据成员加到sum中
return sum;
}
//Sales_data非成员接口函数
ostream& print(ostream& os, const Sales_data& item)//将Sales_data对象的值输出到ostream
{
os << item.isbn() << " " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}
//Sales_data非成员接口函数
istream& read(istream& is, Sales_data& item) //将数据从istream 读入到Sales_data对象中
{
double price = 0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = price*item.units_sold;
return is;
}
int main()
{
Sales_data total;
total.isbn();
return 0;
}
ex7.4
//ex7.4 编写一个名为person 的类,使其表示人员的姓名和住址。使用
//string对象存放这些元素,接下来的练习将不断充实这个类的其他特征。
#include<iostream>
#include<string>
using namespace std;
struct Person
{
string name() const { return Name; }
string addr() const { return Addr; }
string Name;
string Addr;
};
ostream& print(ostream& os, const Person& item)
{
os << item.name() << " " << item.addr();
return os;
}
istream& read(istream& is, Person& item)
{
is >> item.Name >> item.Addr ;
return is;
}
int main()
{
Person total;
total.addr();
total.name();
return 0;
}
ex7.12
#include<iostream>
#include<string>
using namespace std;
struct Sales_data //类
{
//构造函数
Sales_data() = default;
Sales_data(const string& s) :bookNo(s) {}//构造函数初始值列表
Sales_data(const string &s,unsigned n,double p):
bookNo(s),units_sold(n), revenue(p* n) {}
//read的声明
Sales_data(istream& is)//这里是类内部 不要Sales_data::
{
read(is, *this);
}
// Sales_data(istream&);这个去掉
//其他成员
//新成员
string isbn() const { return bookNo; }//ISBN编号
Sales_data& combine(const Sales_data&);//将Sales_data对象加到另一个对象上
istream& read(istream& is, Sales_data& item) //将数据从istream 读入到Sales_data对象中
{
double price = 0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = price * item.units_sold;
return is;
}
double avg_price() const;
//数据成员
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
//Sales_data::Sales_data(istream& is)
//{
// read(is, *this);
//}
//在类的外部定义成员函数
double Sales_data::avg_price()const
{
if (units_sold) return revenue / units_sold;
else return 0;
}
//定义一个返回this的对象函数
Sales_data& Sales_data::combine(const Sales_data& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return* this;
}
//Sales_data非成员接口函数
Sales_data add(const Sales_data & lhs, const Sales_data& rhs)//执行两个Sales_data对象加法
{
Sales_data sum = lhs;//lsh的数据成员拷贝给sum
sum.combine(rhs);//lsh的数据成员加到sum中
return sum;
}
//Sales_data非成员接口函数
ostream& print(ostream& os, const Sales_data& item)//将Sales_data对象的值输出到ostream
{
os << item.isbn() << " " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}
int main()
{
Sales_data total;
print(cout, total);
cout << endl;
Sales_data item1("23456-8888");
print(cout, item1);
cout << endl;
Sales_data item2("23456-8888", 5, 23);
print(cout, item2);
cout<<item2.avg_price();
cout << endl;
Sales_data item3(cin);
print(cout, item3);
cout << endl;
// total.isbn();
return 0;
}
ex7.11
#include<iostream>
#include<string>
using namespace std;
struct Sales_data //类
{
//构造函数
Sales_data() = default;
Sales_data(const string& s) :bookNo(s) {}//构造函数初始值列表
Sales_data(const string &s,unsigned n,double p):
bookNo(s),units_sold(n), revenue(p* n) {}
Sales_data(istream&);
//其他成员
//新成员
string isbn() const { return bookNo; }//ISBN编号
Sales_data& combine(const Sales_data&);//将Sales_data对象加到另一个对象上
double avg_price() const;
//数据成员
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
//Sales_data非成员接口函数
istream& read(istream& is, Sales_data& item) //将数据从istream 读入到Sales_data对象中
{
double price = 0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = price * item.units_sold;
return is;
}
Sales_data::Sales_data(istream& is)
{
read(is, *this);
}
//在类的外部定义成员函数
double Sales_data::avg_price()const
{
if (units_sold) return revenue / units_sold;
else return 0;
}
//定义一个返回this的对象函数
Sales_data& Sales_data::combine(const Sales_data& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return* this;
}
//Sales_data非成员接口函数
Sales_data add(const Sales_data & lhs, const Sales_data& rhs)//执行两个Sales_data对象加法
{
Sales_data sum = lhs;//lsh的数据成员拷贝给sum
sum.combine(rhs);//lsh的数据成员加到sum中
return sum;
}
//Sales_data非成员接口函数
ostream& print(ostream& os, const Sales_data& item)//将Sales_data对象的值输出到ostream
{
os << item.isbn() << " " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}
int main()
{
Sales_data total;
print(cout, total);
cout << endl;
Sales_data item1("23456-8888");
print(cout, item1);
cout << endl;
Sales_data item2("23456-8888", 5, 23);
print(cout, item2);
cout << endl;
Sales_data item3(cin);
print(cout, item3);
cout << endl;
total.isbn();
return 0;
}
ex7.21
#include<iostream>
using namespace std;
class Sales_data
{
//友元函数
friend Sales_data add(const Sales_data&, const Sales_data&);
friend istream& read(istream&, Sales_data&);
friend ostream& print(ostream&, const Sales_data&);
public:
Sales_data() = default;
Sales_data(const string & s) :bookNo(s) {}//构造函数初始值列表
Sales_data(const string & s, unsigned n, double p) :
bookNo(s), units_sold(n), revenue(p * n) {}
//read的声明
Sales_data(istream&);//只需声明不需定义 这里是类内部 不要Sales_data::
string isbn() const { return bookNo; }//ISBN编号
Sales_data& combine(const Sales_data&);//将Sales_data
inline double avg_price() const
{
return units_sold ? revenue / units_sold : 0;
};
private://在内部可以访问 外部不可访问
//数据成员
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
//定义一个返回this的对象函数
Sales_data& Sales_data::combine(const Sales_data& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return*this;
}
//Sales_data非成员接口函数
Sales_data add(const Sales_data& lhs, const Sales_data& rhs)//执行两个Sales_data对象加法
{
Sales_data sum = lhs;//lsh的数据成员拷贝给sum
sum.combine(rhs);//lsh的数据成员加到sum中
return sum;
}
//Sales_data非成员接口函数
ostream& print(ostream& os, const Sales_data& item)//将Sales_data对象的值输出到ostream
{
os << item.isbn() << " " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}
//声明
Sales_data add(const Sales_data&, const Sales_data&);
istream& read(istream&, Sales_data&);
ostream& print(ostream&, const Sales_data&);
int main()
{
Sales_data total;
print(cout, total);
cout << endl;
Sales_data item1("23456-8888");
print(cout, item1);
cout << endl;
Sales_data item2("23456-8888", 5, 23);
print(cout, item2);
cout << endl;
//Sales_data item3(cin);
//print(cout, item3);
//cout << endl;
return 0;
}
ex7.22(报错)
//ex7.4 编写一个名为person 的类,使其表示人员的姓名和住址。使用
//string对象存放这些元素,接下来的练习将不断充实这个类的其他特征。
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
friend ostream& print(ostream& , const Person& );
friend istream& read(istream& , Person& );
//构造函数
string name() const { return Name; }
string addr() const { return Addr; }
private:
//数据成员
string Name;
string Addr;
};
ostream& print(ostream& os, const Person& item)
{
os << item.name() << " " << item.addr();
return os;
}
istream& read(istream& is, Person& item)
{
is >> item.Name >> item.Addr ;
return is;
}
int main()
{
//Person zhangsan("s","sa");报错
//print(cout, zhangsan);
Person total;
total.addr();
total.name();
return 0;
}
ex7.24
#include<iostream>
#include<vector>
using namespace std;
class Screen
{
public:
void some_member() const;
typedef string::size_type pos;
Screen() = default;
Screen(pos ht, pos wd, char c) :height(ht), width(wd), contents(ht* wd, c) {}
Screen(pos ht, pos wd) :height(ht), width(wd), contents(ht* wd, ' ') {}
char get()const { return contents[cursor]; }
inline char get( pos ht,pos wd )const;
Screen& move(pos r, pos c);
private:
mutable size_t access_ctr;
pos cursor = 0;
pos height = 0, width = 0;
string contents;
};
inline
Screen& Screen::move(pos r, pos c)//r行c列
{
pos row = r * width;
cursor = row + c;//光标 移动往下加c行
return*this;
}
char Screen::get(pos r, pos c)const
{
pos row = r * width;
return contents[row + c];
}
void Screen::some_member()const
{
++access_ctr;
}
class window_mgr
{
private:
vector<Screen> screen{ Screen(24,80, ' ') };
};
int main()
{
return 0;
}
ex7.24
#include<iostream>
#include<vector>
using namespace std;
class Screen
{
public:
void some_member() const;
typedef string::size_type pos;
Screen() = default;
Screen(pos ht, pos wd, char c) :height(ht), width(wd), contents(ht* wd, c) {}
Screen(pos ht, pos wd) :height(ht), width(wd), contents(ht* wd, ' ') {}
Screen& set(char);
Screen& set(pos r, pos c, char);
char get()const { return contents[cursor]; }
Screen& display(ostream& os)
{
do_display(os);// do_display只是一个名字 真正起作用的是另外的函数
return *this;//不是常量
}
const Screen& display(ostream& os)const//这里是display 不要写错
{
do_display(os);
return *this;//常量
}
inline char get( pos ht,pos wd )const;
Screen& move(pos r, pos c);
private:
mutable size_t access_ctr;
pos cursor = 0;
pos height = 0, width = 0;
string contents;
void do_display(ostream& os)const { os << contents; }
};
inline
Screen& Screen::move(pos r, pos c)//r行c列
{
pos row = r * width;
cursor = row + c;//光标 移动往下加c行
return*this;
}
char Screen::get(pos r, pos c)const
{
pos row = r * width;
return contents[row + c];
}
void Screen::some_member()const
{
++access_ctr;
}
//声明
inline Screen& Screen::set(char c)
{
contents[cursor] = c;
return *this;
}
inline Screen& Screen::set(pos row, pos col, char ch)//不移动光标
{
contents[row * width + col] = ch;
return *this;
}
class window_mgr
{
private:
vector<Screen> screen{ Screen(24,80, ' ') };
};
int main()
{
Screen myScreen(5, 5, 'x');
myScreen.move(4, 0).set('#').display(cout);
cout << "\n";//换行
myScreen.display(cout);
cout<<endl;
return 0;
}
ex7_29
#include<iostream>
#include<vector>
using namespace std;
class Screen
{
public:
void some_member() const;
typedef string::size_type pos;
Screen() = default;
Screen(pos ht, pos wd, char c) :height(ht), width(wd), contents(ht* wd, c) {}
Screen(pos ht, pos wd) :height(ht), width(wd), contents(ht* wd, ' ') {}
Screen set(char);
Screen& set(pos r, pos c, char);
char get()const { return contents[cursor]; }
Screen display(ostream& os)
{
do_display(os);// do_display只是一个名字 真正起作用的是另外的函数
return *this;//不是常量
}
const Screen display(ostream& os)const
{
do_display(os);
return *this;//常量
}
inline char get( pos ht,pos wd )const;
Screen move(pos r, pos c);
private:
mutable size_t access_ctr;
pos cursor = 0;
pos height = 0, width = 0;
string contents;
void do_display(ostream& os)const { os << contents; }
};
inline
Screen Screen::move(pos r, pos c)//r行c列
{
pos row = r * width;
cursor = row + c;//光标 移动往下加c行
return*this;
}
char Screen::get(pos r, pos c)const
{
pos row = r * width;
return contents[row + c];
}
void Screen::some_member()const
{
++access_ctr;
}
//声明
inline Screen Screen::set(char c)
{
contents[cursor] = c;
return *this;
}
inline Screen& Screen::set(pos row, pos col, char ch)//不移动光标
{
contents[row * width + col] = ch;
return *this;
}
class window_mgr
{
private:
vector<Screen> screen{ Screen(24,80, ' ') };
};
int main()
{
Screen myScreen(5, 5, 'x');
myScreen.move(4, 0).set('#').display(cout);
cout << "\n";//换行
myScreen.display(cout);
cout<<endl;
return 0;
}
ex7.31
#include<iostream>
using namespace std;
struct Y;//Y在x 之前被声明
struct X//X在Y前被定义 顺序不变
{
Y* p;
};
struct Y
{
X x;
};
int main()
{
return 0;
}
ex7.31(2)
#include<iostream>
using namespace std;
void f();
struct X
{
friend void f() {}
X() { f(); }
void g();
void h();
};
void X::g() { return f(); }
void X::h() { return f(); }
int main()
{
return 0;
}
ex7.32
#include<iostream>
#include<vector>
using namespace std;
class Screen;//声明
class Window_mgr
{
public:
using ScreenIndex = vector<Screen>::size_type;
inline void clear(ScreenIndex);
private:
vector<Screen> screen;//去掉内部初始化
};
class Screen
{
friend class Window_mgr;
public:
void some_member() const;
typedef string::size_type pos;
Screen() = default;
Screen(pos ht, pos wd, char c) :height(ht), width(wd), contents(ht* wd, c) {}
Screen(pos ht, pos wd) :height(ht), width(wd), contents(ht* wd, ' ') {}
Screen set(char);
Screen& set(pos r, pos c, char);
char get()const { return contents[cursor]; }
Screen display(ostream& os)
{
do_display(os);// do_display只是一个名字 真正起作用的是另外的函数
return *this;//不是常量
}
const Screen display(ostream& os)const
{
do_display(os);
return *this;//常量
}
inline char get(pos ht, pos wd)const;
Screen move(pos r, pos c);
private:
mutable size_t access_ctr;
pos cursor = 0;
pos height = 0, width = 0;
string contents;
void do_display(ostream& os)const { os << contents; }
};
inline
Screen Screen::move(pos r, pos c)//r行c列
{
pos row = r * width;
cursor = row + c;//光标 移动往下加c行
return*this;
}
char Screen::get(pos r, pos c)const
{
pos row = r * width;
return contents[row + c];
}
void Screen::some_member()const
{
++access_ctr;
}
//声明
inline Screen Screen::set(char c)
{
contents[cursor] = c;
return *this;
}
inline Screen& Screen::set(pos row, pos col, char ch)//不移动光标
{
contents[row * width + col] = ch;
return *this;
}
void Window_mgr::clear(ScreenIndex i)
{
if (i >= screen.size())return;
Screen& s = screen[i];
s.contents = string(s.height * s.width, ' ');
}
int main()
{
Screen myScreen(5, 5, 'x');
myScreen.move(4, 0).set('#').display(cout);
cout << "\n";//换行
myScreen.display(cout);
cout << endl;
return 0;
}
ex7.33
#include<iostream>
#include<vector>
using namespace std;
class Screen;//声明
class Window_mgr
{
public:
using ScreenIndex = vector<Screen>::size_type;
inline void clear(ScreenIndex);
private:
vector<Screen> screen;//去掉内部初始化
};
class Screen
{
friend class Window_mgr;
public:
void some_member() const;
typedef string::size_type pos;
Screen() = default;
Screen(pos ht, pos wd, char c) :height(ht), width(wd), contents(ht* wd, c) {}
Screen(pos ht, pos wd) :height(ht), width(wd), contents(ht* wd, ' ') {}
Screen set(char);
Screen& set(pos r, pos c, char);
char get()const { return contents[cursor]; }
Screen display(ostream& os)
{
do_display(os);// do_display只是一个名字 真正起作用的是另外的函数
return *this;//不是常量
}
const Screen display(ostream& os)const
{
do_display(os);
return *this;//常量
}
pos size()const;
/*Screen::pos Screen::size()const
{
return height * width;
}*/
inline char get(pos ht, pos wd)const;
Screen move(pos r, pos c);
private:
mutable size_t access_ctr;
pos cursor = 0;
pos height = 0, width = 0;
string contents;
void do_display(ostream& os)const { os << contents; }
};
Screen::pos Screen::size()const
{
return height * width;
}
inline Screen Screen::move(pos r, pos c)//r行c列
{
pos row = r * width;
cursor = row + c;//光标 移动往下加c行
return*this;
}
char Screen::get(pos r, pos c)const
{
pos row = r * width;
return contents[row + c];
}
void Screen::some_member()const
{
++access_ctr;
}
//声明
inline Screen Screen::set(char c)
{
contents[cursor] = c;
return *this;
}
inline Screen& Screen::set(pos row, pos col, char ch)//不移动光标
{
contents[row * width + col] = ch;
return *this;
}
void Window_mgr::clear(ScreenIndex i)
{
if (i >= screen.size())return;
Screen& s = screen[i];
s.contents = string(s.height * s.width, ' ');
}
int main()
{
Screen myScreen(5, 5, 'x');
myScreen.move(4, 0).set('#').display(cout);
cout << "\n";//换行
myScreen.display(cout);
cout << endl;
return 0;
}
ex7.36
#include<iostream>
using namespace std;
class Sales_data
{
//友元函数
friend Sales_data add(const Sales_data&, const Sales_data&);
friend istream& read(istream&, Sales_data&);
friend ostream& print(ostream&, const Sales_data&);
public:
Sales_data() = default;
Sales_data(const string& s) :bookNo(s) {}//构造函数初始值列表
Sales_data(const string& s, unsigned n, double p) :
bookNo(s), units_sold(n), revenue(p* n) {}
//read的声明
Sales_data(istream);//只需声明不需定义 这里是类内部 不要Sales_data::
string isbn() const { return bookNo; }//ISBN编号
Sales_data& combine(const Sales_data&);//将Sales_data
inline double avg_price() const
{
return units_sold ? revenue / units_sold : 0;
};
private://在内部可以访问 外部不可访问
//数据成员
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
//定义一个返回this的对象函数
Sales_data& Sales_data::combine(const Sales_data& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return*this;
}
//Sales_data非成员接口函数
Sales_data add(const Sales_data& lhs, const Sales_data& rhs)//执行两个Sales_data对象加法
{
Sales_data sum = lhs;//lsh的数据成员拷贝给sum
sum.combine(rhs);//lsh的数据成员加到sum中
return sum;
}
//Sales_data非成员接口函数
ostream& print(ostream& os, const Sales_data& item)//将Sales_data对象的值输出到ostream
{
os << item.isbn() << " " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}
//声明
Sales_data add(const Sales_data&, const Sales_data&);
istream& read(istream&, Sales_data&);
ostream& print(ostream&, const Sales_data&);
int main()
{
Sales_data total;
print(cout, total);
cout << endl;
Sales_data item1("23456-8888");
print(cout, item1);
cout << endl;
Sales_data item2("23456-8888", 5, 23);
print(cout, item2);
cout << endl;
//Sales_data item3(cin);
//print(cout, item3);
//cout << endl;
return 0;
}
ex7.34
#include<iostream>
#include<string>
using namespace std;
typedef string Type;
Type initVal();
class Exercise
{
public:
typedef double Type;
Type setVal(Type);
Type initVal();
private:
int val;
};
//声明
Exercise::Type Exercise::initVal()//定义setVal
{
return val;
}
Exercise::Type Exercise::setVal(Type parm)//定义setVal
{
val = parm + initVal();
return val;
}
int main()
{
return 0;
}
ex7.40
class Book//成员
{
public:
istream &read(istream &);
string &get_isbn();
unsigned get_sales();
private:
string isbn;
string name;
double price;
string publisher;
string date;
string category;
}
ex7.43
#include<iostream>
using namespace std;
class No {
public:
No(int a) {
}
};
struct A {
A(int a=0) : my_mem{ a } {}//对my_mem赋值 a=0不能少
No my_mem;
};
A a(9);
int main()
{
return 0;
}
ex7.45
#include<iostream>
#include<vector>
using namespace std;
class No {
public:
No(int a) {
}
};
struct A {
A(int a=0) : my_mem{ a } {}//对my_mem赋值 a=0不能少
No my_mem;
};
A a(9);
int main()
{
vector<A> vec(10);
return 0;
}
ex7.48
#include<iostream>
using namespace std;
class Sales_data
{
//友元函数
friend Sales_data add(const Sales_data&, const Sales_data&);
friend istream& read(istream&, Sales_data&);
friend ostream& print(ostream&, const Sales_data&);
public:
Sales_data() = default;
explicit Sales_data(const string& s) :bookNo(s) {}//构造函数初始值列表
Sales_data(const string& s, unsigned n, double p) :
bookNo(s), units_sold(n), revenue(p* n) {}
//read的声明
Sales_data(istream&);//只需声明不需定义 这里是类内部 不要Sales_data::
string isbn() const { return bookNo; }//ISBN编号
Sales_data& combine(const Sales_data&);//将Sales_data
inline double avg_price() const
{
return units_sold ? revenue / units_sold : 0;
};
private://在内部可以访问 外部不可访问
//数据成员
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
//定义一个返回this的对象函数
Sales_data& Sales_data::combine(const Sales_data& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return*this;
}
//Sales_data非成员接口函数
Sales_data add(const Sales_data& lhs, const Sales_data& rhs)//执行两个Sales_data对象加法
{
Sales_data sum = lhs;//lsh的数据成员拷贝给sum
sum.combine(rhs);//lsh的数据成员加到sum中
return sum;
}
//Sales_data非成员接口函数
ostream& print(ostream& os, const Sales_data& item)//将Sales_data对象的值输出到ostream
{
os << item.isbn() << " " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}
//声明
Sales_data add(const Sales_data&, const Sales_data&);
istream& read(istream&, Sales_data&);
ostream& print(ostream&, const Sales_data&);
int main()
{
//Sales_data total;
//print(cout, total);
//cout << endl;
//Sales_data item1("23456-8888");
//print(cout, item1);
//cout << endl;
//Sales_data item2("23456-8888", 5, 23);
//print(cout, item2);
//cout << endl;
//Sales_data item3(cin);
//print(cout, item3);
//cout << endl;
string null_isbn("9 - 99 - 999999");
Sales_data item1(null_isbn);
Sales_data item2("99999");
return 0;
}
ex7.58
#include<iostream>
#include<vector>
using namespace std;
class Example {
public:
static double rate;//不能double赋值
static const int vecSize = 20;
static vector<double>vec;
};
double Example::rate = 6.5;//在外边给初始值
vector<double>Example::vec(Example::vecSize);
int main()
{
return 0;
}