美文网首页
c++primer 7.11-7.22

c++primer 7.11-7.22

作者: 青吟乐 | 来源:发表于2019-04-29 15:45 被阅读0次

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;
}

相关文章

网友评论

      本文标题:c++primer 7.11-7.22

      本文链接:https://www.haomeiwen.com/subject/vhuynqtx.html