7.11,重点在于默认构造函数的定义和用法
class Sales_data
{
public:
Sales_data() = default;//默认构造函数
Sales_data(const std::string &s) :bookNo(s) {}//只有一个参数的构造函数
Sales_data(const std::string &s, unsigned n, double p) :bookNo(s), units_sold(n), revenue(n*p) {}//三个参数的构造函数
Sales_data(std::istream &is);//有一个输入流的构造函数
std::string isbn() const { return bookNo; };//返回书本编号的函数
Sales_data& combine(const Sales_data&);//收益相加的函数
std::string bookNo;//编号
unsigned units_sold = 0;//卖的数量,默认为零
double revenue = 0.0;//收益
};
std::istream &read(std::istream &is, Sales_data &item)
{
double price = 0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = price * item.units_sold;
return is;
}
std::ostream &print(std::ostream &os, const Sales_data &item)
{
os << item.isbn() << " " << item.units_sold << " " << item.revenue;
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(std::istream &is)
{
read(is, *this);
}
Sales_data& Sales_data::combine(const Sales_data& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
main函数
int main()
{
Sales_data item1;
print(std::cout, item1) << std::endl;//对每个构造函数的使用都是用输出流函数,无参构造函数,默认使用类中定义的数值
Sales_data item2("i85858585-1");//只有string类型的构造函数
print(std::cout, item2) << std::endl;
Sales_data item3("i85858585-1", 1000, 19.00);//三个参数的构造函数
print(std::cout, item3) << std::endl;
Sales_data item4(std::cin);//有一个输入流对象的构造函数
print(std::cout, item4) << std::endl;
return 0;
}
7.12 在类的内部加:(在7.11题目中已经添加完)
Sales_data::Sales_data(std::istream &is)
{
read(is, *this);
}
7.13
void main (){
Sales_data total("os9001-1",100,7000.0);
if (!total.isbn().empty())
{
istream &is = cin;
while (is)
{
Sales_data trans(is);
if (total.isbn() == trans.isbn())
total.combine(trans);
else
{
print(cout, total) << endl;
total = trans;
}
}
print(:cout, total) <<endl;
}
else
{
cout << "No data?!" << endl;
return 0;
}
return 0;
}
7.14:这个题是构造函数定义方法的一种,例如
Sales_data() : units_sold(0) , revenue(0) { }
这就使得在实例化对象的时候,对象的units_sold和revenue都为0;
7.15person类
class Person;
istream &read(std::istream&, Person&);
class Person{
public:
Person(string value_name, string value_address):value_name(value_name),value_address(value_address){}//构造函数
Person();//默认构造函数
void info(){
cout<<value_name<<"的地址是"<<value_address<<endl;
}
string const & get_name() {//这里的get函数是要加cosnt的
return value_name;//因为私有属性仅允许通过public方法访问不允许修改
}
string const & get_address() {
return value_address;
}
string value_name;
string value_address;
};
std::istream &read(std::istream &is, Person &person)
{
is >> person.value_name >> person.value_address;
return is;
}
std::ostream &print(std::ostream &os, const Person &person)
{
os << person.value_name << " " << person.value_address;
return os;
}
7.16 public之后跟随的是整个程序可以访问的数据成员,private之后跟随的是在类内部访问的数据成员
7.17 class默认为private属性,struct默认为public属性
7.18 将不希望用户能了解的内容隐藏起来就叫封装
7.19 数据成员作为私有对象,操作数据成员的接口作为公共部分
7.20:类之外要使用类的私有数据成员的时候可以使用友元
7.21:Person类改进为
using namespace std;
class Sales_data
{
friend std::istream &read(std::istream &is, Sales_data &item);//三个友元函数,要在类外操作私有数据的
friend std::ostream &print(std::ostream &os, const Sales_data &item);
friend Sales_data add(const Sales_data &lhs, const Sales_data &rhs);
public:
Sales_data() = default;//四个构造函数
Sales_data(const std::string &s) :bookNo(s) {}
Sales_data(const std::string &s, unsigned n, double p) :bookNo(s), units_sold(n), revenue(n*p) {}
Sales_data(std::istream &is) { read(is, *this); }
std::string isbn() const { return bookNo; };//返回编号
Sales_data& combine(const Sales_data&);//收益相加
private:
std::string bookNo;
unsigned units_sold=0 ;
double revenue =0.0;
};
Sales_data& Sales_data::combine(const Sales_data& rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
std::istream &read(std::istream &is, Sales_data &item)
{
double price = 0;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = price * item.units_sold;
return is;
}
std::ostream &print(std::ostream &os, const Sales_data &item)
{
os << item.isbn() << " " << item.units_sold << " " << item.revenue;
return os;
}
Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
{
Sales_data sum = lhs;
sum.combine(rhs);
return sum;
}
7.22:Person代码
class Person{
friend std::istream &read(std::istream &is, Person &person);//对于以前操作类私有数据的方法声明为友元函数
friend std::ostream &print(std::ostream &os, const Person &person);
public:
Person(string value_name, string value_address):value_name(value_name),value_address(value_address){}//构造函数
Person();//默认构造函数
void info(){
cout<<value_name<<"的地址是"<<value_address<<endl;
}
string const & get_name() {//这里的get函数是要加cosnt的
return value_name;//因为私有属性仅允许通过public方法访问不允许修改
}
string const & get_address() {
return value_address;
}
private:
string value_name;
string value_address;
};
/**类外重新声明 */
std::istream &read(std::istream &is, Person &person);
std::ostream &print(std::ostream &os, const Person &person);
std::istream &read(std::istream &is, Person &person)
{
is >> person.value_name >> person.value_address;
return is;
}
std::ostream &print(std::ostream &os, const Person &person)
{
os << person.value_name << " " << person.value_address;
return os;
}








网友评论