C++ Primer(第五版) 第七章练习答案

C++ Primer(第五版) 第七章练习答案

目录

  • C++ Primer(第五版) 第七章练习答案
      • 7.1
      • 7.2
      • 7.3
      • 7.4
      • 7.5
      • 7.6
      • 7.7
      • 7.8
      • 7.9
      • 7.10
      • 7.11
      • 7.12
      • 7.13
      • 7.14
      • 7.15
      • 7.16
      • 7.17
      • 7.18
      • 7.19
      • 7.20
      • 7.21
      • 7.22
      • 7.23
      • 7.24
      • 7.25
      • 7.26
      • 7.27
      • 7.28
      • 7.29
      • 7.30
      • 7.31
      • 7.32
      • 7.33
      • 7.34
      • 7.35
      • 7.36
      • 7.37
      • 7.38
      • 7.39
      • 7.40.cc
      • 7.40.h
      • 7.41.cc
      • 7.41.h
      • 7.42
      • 7.43
      • 7.44
      • 7.45
      • 7.46
      • 7.47
      • 7.48
      • 7.49
      • 7.50
      • 7.51
      • 7.52
      • 7.53
      • 7.54
      • 7.55
      • 7.56
      • 7.57.cc
      • 7.57.h
      • 7.58

7.1

#include 
#include 
#include "../2/2_40.h"

using namespace std;

int main()
{
     
    Sales_data total;

    if (cin >> total.bookNo >> total.units_sold >> total.revenue)
    {
     
        Sales_data trans;

        while (cin >> trans.bookNo >> trans.units_sold >> trans.revenue)
        {
     
            // 书名相同
            if (total.bookNo == trans.bookNo)
            {
     
                total.units_sold += trans.units_sold;
                total.revenue += trans.revenue;
            }
            else // 不同输出第一个
            {
     
                cout << total.bookNo << " "
                     << total.units_sold << " "
                     << total.revenue << endl;
                // 第二个 赋值 给 第一个
                total.bookNo = trans.bookNo;
                total.units_sold = trans.units_sold;
                total.revenue = trans.revenue;
            }
        }
        // 输出最后一个
        cout << total.bookNo << " "
             << total.units_sold << " "
             << total.revenue << endl;
    }
    else
    {
     
        cerr << "No data?!" << endl;
        return -1;
    }

    return 0;
}

7.2

#include 

struct Sales_data {
     

    // 返回书号
    std::string isbn() const {
      return bookNo; }
    // +=
    Sales_data& combine(const Sales_data &rhs);

    // 书号
    std::string bookNo;
    // 售卖单位
    unsigned units_sold = 0;
    // 收入
    double revenue = 0.0;
};

inline
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
     
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;

    return *this;
}

7.3

#include 
#include 
#include "7_2.h"

using namespace std;

int main()
{
     
    Sales_data total;

    if (cin >> total.bookNo >> total.units_sold >> total.revenue)
    {
     
        Sales_data trans;

        while (cin >> trans.bookNo >> trans.units_sold >> trans.revenue)
        {
     
            // 书名相同
            if (total.isbn() == trans.isbn())
            {
     
                total.combine(trans);
            }
            else // 不同输出第一个
            {
     
                cout << total.bookNo << " "
                     << total.units_sold << " "
                     << total.revenue << endl;
                // 第二个 赋值 给 第一个
                total.bookNo = trans.bookNo;
                total.units_sold = trans.units_sold;
                total.revenue = trans.revenue;
            }
        }
        // 输出最后一个
        cout << total.bookNo << " "
             << total.units_sold << " "
             << total.revenue << endl;
    }
    else
    {
     
        cerr << "No data?!" << endl;
        return -1;
    }

    return 0;
}

7.4

#include 


struct Person {
     
    // 名字
    std::string name;
    // 地址
    std::string address;
};

7.5

#include 

/**
 * 因为不用更改 this 所以是 const
 */

struct Person {
     

    // 获取名字
    std::string getname() const {
      return name; }
    // 获取地址
    std::string getaddress() const {
      return address; }

    // 名字
    std::string name;
    // 地址
    std::string address;
};

7.6

#include 
#include 


struct Sales_data {
     

    // 返回书号
    std::string isbn() const {
      return bookNo; }
    // +=
    Sales_data& combine(const Sales_data &rhs);

    // 书号
    std::string bookNo;
    // 售卖单位
    unsigned units_sold = 0;
    // 收入
    double revenue = 0.0;
};

inline
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
     
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;

    return *this;
}

// 辅助函数

// +
Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
{
     
    Sales_data sum = lhs;
    sum.combine(rhs);

    return sum;
}

// 输入
std::istream &read(std::istream &is, Sales_data &item)
{
     
    is >> item.bookNo
       >> item.units_sold
       >> item.revenue;

    return is;
}

// 输出
std::ostream &print(std::ostream &os, const Sales_data &item)
{
     
    os << item.bookNo << " "
       << item.units_sold << " "
       << item.revenue;

    return os;
}

7.7

#include 
#include 
#include "7_6.h"

using namespace std;

int main()
{
     
    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 -1;
    }

    return 0;
}

7.8


/**
 * read 要写值
 * print 不用写值
 */

7.9

#include 
#include 


struct Person {
     

    // 获取名字
    std::string getname() const {
      return name; }
    // 获取地址
    std::string getaddress() const {
      return address; }

    // 名字
    std::string name;
    // 地址
    std::string address;
};

// 辅助函数

// 输入
inline
std::istream &read(std::istream &is, Person &item)
{
     
    is >> item.name >> item.address;

    return is;
}

// 输出
inline
std::ostream &print(std::ostream &os, const Person &item)
{
     
    os << item.name << " "
       << item.address;

    return os;
}

7.10


/**
 * 两个输入正确为真
 */

7.11

#include 
#include 

struct Sales_data {
     

    // 构造函数
    Sales_data() = default;
    Sales_data(std::istream &is) {
      read(is, *this); }
    Sales_data(const std::string &s) : bookNo(s) {
      }
    Sales_data(const std::string &s, unsigned u, double d) : bookNo(s), units_sold(u), revenue(d) {
      }

    // 返回书号
    std::string isbn() const {
      return bookNo; }
    // +=
    Sales_data& combine(const Sales_data &rhs);

    // 书号
    std::string bookNo;
    // 售卖单位
    unsigned units_sold = 0;
    // 收入
    double revenue = 0.0;
};

inline
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
     
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;

    return *this;
}

// 辅助函数

// +
inline
Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
{
     
    Sales_data sum = lhs;
    sum.combine(rhs);

    return sum;
}

// 输入
inline
std::istream &read(std::istream &is, Sales_data &item)
{
     
    is >> item.bookNo
       >> item.units_sold
       >> item.revenue;

    return is;
}

// 输出
inline
std::ostream &print(std::ostream &os, const Sales_data &item)
{
     
    os << item.bookNo << " "
       << item.units_sold << " "
       << item.revenue;

    return os;
}

7.12

#include 
#include 

// 声明
struct Sales_data;

Sales_data add(const Sales_data &lhs, const Sales_data &rhs);
std::istream &read(std::istream &is, Sales_data &item);
std::ostream &print(std::ostream &os, const Sales_data &item);


struct Sales_data {
     

    // 构造函数
    Sales_data() = default;
    Sales_data(std::istream &is) {
      read(is, *this); }
    Sales_data(const std::string &s) : bookNo(s) {
      }
    Sales_data(const std::string &s, unsigned u, double d) : bookNo(s), units_sold(u), revenue(d) {
      }

    // 返回书号
    std::string isbn() const {
      return bookNo; }
    // +=
    Sales_data& combine(const Sales_data &rhs);

    // 书号
    std::string bookNo;
    // 售卖单位
    unsigned units_sold = 0;
    // 收入
    double revenue = 0.0;
};

inline
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
     
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;

    return *this;
}


// 辅助函数

// +
inline
Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
{
     
    Sales_data sum = lhs;
    sum.combine(rhs);

    return sum;
}

// 输入
inline
std::istream &read(std::istream &is, Sales_data &item)
{
     
    is >> item.bookNo
       >> item.units_sold
       >> item.revenue;

    return is;
}

// 输出
inline
std::ostream &print(std::ostream &os, const Sales_data &item)
{
     
    os << item.bookNo << " "
       << item.units_sold << " "
       << item.revenue;

    return os;
}

7.13

#include 
#include 
#include "7_12.h"

using namespace std;

int main()
{
     
    Sales_data total(cin);

    if (cin)
    {
     
        do
        {
     
            Sales_data trans(cin);

            // 书名相同
            if (total.isbn() == trans.isbn())
            {
     
                total.combine(trans);
            }
            else // 不同输出第一个
            {
     
                print(cout, total) << endl;
                // 第二个 赋值 给 第一个
                total = trans;
            }

        } while(cin);
        // 输出最后一个
        // print(cout, total) << endl;
    }
    else
    {
     
        cerr << "No data?!" << endl;
        return -1;
    }

    return 0;
}

7.14


Sales_data() : bookNo(std::string()), units_sold(0), revenue(0.0) {
      }

7.15

#include 
#include 

struct Person;

std::istream &read(std::istream &is, Person &item);
std::ostream &print(std::ostream &os, const Person &item);


struct Person {
     

    // 构造函数
    Person() = default;
    Person(std::istream &is) {
      read(is, *this); }
    Person(const std::string &s) : name(s) {
      }
    Person(const std::string &n, const std::string &a) : name(n), address(a) {
      }

    // 获取名字
    std::string getname() const {
      return name; }
    // 获取地址
    std::string getaddress() const {
      return address; }

    // 名字
    std::string name;
    // 地址
    std::string address;
};

// 辅助函数

// 输入
inline
std::istream &read(std::istream &is, Person &item)
{
     
    is >> item.name >> item.address;

    return is;
}

// 输出
inline
std::ostream &print(std::ostream &os, const Person &item)
{
     
    os << item.name << " "
       << item.address;

    return os;
}

7.16


/**
 * 没有
 * 接口
 * 数据成员
 */

7.17


/**
 * 默认访问权限不一样
 * struct public
 * class private
 */

7.18


/**
 * 隐藏实现细节
 * 保护数据
 */

7.19

#include 
#include 

class Person;

std::istream &read(std::istream &is, Person &item);
std::ostream &print(std::ostream &os, const Person &item);


class Person {
     

friend std::istream &read(std::istream &is, Person &item);
friend std::ostream &print(std::ostream &os, const Person &item);

public:
    // 构造函数
    Person() = default;
    Person(std::istream &is) {
      read(is, *this); }
    Person(const std::string &s) : name(s) {
      }
    Person(const std::string &n, const std::string &a) : name(n), address(a) {
      }

    // 获取名字
    std::string getname() const {
      return name; }
    // 获取地址
    std::string getaddress() const {
      return address; }
private:
    // 名字
    std::string name;
    // 地址
    std::string address;
};

// 辅助函数

// 输入
inline
std::istream &read(std::istream &is, Person &item)
{
     
    is >> item.name >> item.address;

    return is;
}

// 输出
inline
std::ostream &print(std::ostream &os, const Person &item)
{
     
    os << item.name << " "
       << item.address;

    return os;
}

7.20



/**
 * 访问类的非公有成员
 * 方便调用非公有成员
 * 破化封装性
 */

7.21

#include 
#include 

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(std::istream &is) {
      read(is, *this); }
    Sales_data(const std::string &s) : bookNo(s) {
      }
    Sales_data(const std::string &s, unsigned u, double d) : bookNo(s), units_sold(u), revenue(d) {
      }
    // 返回书号
    std::string isbn() const {
      return bookNo; }
    // +=
    Sales_data& combine(const Sales_data &rhs);
private:
    // 书号
    std::string bookNo;
    // 售卖单位
    unsigned units_sold = 0;
    // 收入
    double revenue = 0.0;
};

// 辅助函数
Sales_data add(const Sales_data &lhs, const Sales_data &rhs);
std::istream &read(std::istream &is, Sales_data &item);
std::ostream &print(std::ostream &os, const Sales_data &item);

// 内联函数
inline
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
     
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;

    return *this;
}

7.22

#include 
#include 

class Person {
     
friend std::istream &read(std::istream &is, Person &item);
friend std::ostream &print(std::ostream &os, const Person &item);
public:
    // 构造函数
    Person() = default;
    Person(std::istream &is) {
      read(is, *this); }
    Person(const std::string &s) : name(s) {
      }
    Person(const std::string &n, const std::string &a) : name(n), address(a) {
      }
    // 获取名字
    std::string getname() const {
      return name; }
    // 获取地址
    std::string getaddress() const {
      return address; }
private:
    // 名字
    std::string name;
    // 地址
    std::string address;
};

// 辅助函数
std::istream &read(std::istream &is, Person &item);
std::ostream &print(std::ostream &os, const Person &item);

7.23

#include 

class Screen {
     
public:
    typedef 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 ch) : height(ht), width(wd), contents(ht * wd, ch) {
      }

    // 获取光标
    char get() const {
      return contents[cursor]; }
    char get(pos ht, pos wd) const {
      return contents[ht * width + wd]; }
    // 移动光标
    Screen &move(pos ht, pos wd) {
      cursor = ht * width + wd; return *this; }
private:
    // 光标
    pos cursor = 0;
    // 高
    pos height = 0;
    // 宽
    pos width = 0;
    // 内容
    std::string contents;
};

7.24

#include 

class Screen {
     
public:
    typedef 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 ch) : height(ht), width(wd), contents(ht * wd, ch) {
      }

    // 获取光标
    char get() const {
      return contents[cursor]; }
    char get(pos ht, pos wd) const {
      return contents[ht * width + wd]; }
    // 移动光标
    Screen &move(pos ht, pos wd) {
      cursor = ht * width + wd; return *this; }
private:
    // 光标
    pos cursor = 0;
    // 高
    pos height = 0;
    // 宽
    pos width = 0;
    // 内容
    std::string contents;
};

7.25



/**
 * 能
 * 如果类包含vector或者string成员,则其拷贝,赋值和销毁的合成版本能够正常工作
 */

7.26

#include 
#include 

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(std::istream &is) {
      read(is, *this); }
    Sales_data(const std::string &s) : bookNo(s) {
      }
    Sales_data(const std::string &s, unsigned u, double d) : bookNo(s), units_sold(u), revenue(d) {
      }

    // 返回书号
    std::string isbn() const {
      return bookNo; }
    // +=
    Sales_data& combine(const Sales_data &rhs);
    // 卖出数量
    double avg_price() const {
      return units_sold ? revenue / units_sold : 0; }
private:
    // 书号
    std::string bookNo;
    // 售卖单位
    unsigned units_sold = 0;
    // 收入
    double revenue = 0.0;
};

Sales_data add(const Sales_data &lhs, const Sales_data &rhs);
std::istream &read(std::istream &is, Sales_data &item);
std::ostream &print(std::ostream &os, const Sales_data &item);

inline
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
     
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;

    return *this;
}

7.27

#include 
#include 

class Screen {
     
public:
    typedef 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 ch) : height(ht), width(wd), contents(ht * wd, ch) {
      }

    // 获取光标
    char get() const {
      return contents[cursor]; }
    char get(pos ht, pos wd) const {
      return contents[ht * width + wd]; }
    // 移动光标
    Screen &move(pos ht, pos wd) {
      cursor = ht * width + wd; return *this; }
    // 输入
    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:
    void do_display(std::ostream &os) const;
    // 光标
    pos cursor = 0;
    // 高
    pos height = 0;
    // 宽
    pos width = 0;
    // 内容
    std::string contents;
};

inline
Screen &Screen::set(char ch)
{
     
    contents[cursor] = ch;
    return *this;
}

inline
Screen &Screen::set(pos ht, pos wd, char ch)
{
     
    contents[ht * width + wd] = ch;
    return *this;
}

inline
void Screen::do_display(std::ostream &os) const
{
     
    for (pos i = 0; i != contents.size(); ++i)
    {
     
        os << contents[i];
        if (i % width == width - 1)
            os << std::endl;
    }
}

7.28



/**
 * 一样的输出
 * 对象没有改变
 */

7.29

#include 
#include 

class Screen {
     
public:
    typedef 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 ch) : height(ht), width(wd), contents(ht * wd, ch) {
      }

    // 获取光标
    char get() const {
      return contents[cursor]; }
    char get(pos ht, pos wd) const {
      return contents[ht * width + wd]; }
    // 移动光标
    Screen move(pos ht, pos wd) {
      cursor = ht * width + wd; return *this; }
    // 输入
    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:
    void do_display(std::ostream &os) const;
    // 光标
    pos cursor = 0;
    // 高
    pos height = 0;
    // 宽
    pos width = 0;
    // 内容
    std::string contents;
};

inline
Screen Screen::set(char ch)
{
     
    contents[cursor] = ch;
    return *this;
}

inline
Screen Screen::set(pos ht, pos wd, char ch)
{
     
    contents[ht * width + wd] = ch;
    return *this;
}

inline
void Screen::do_display(std::ostream &os) const
{
     
    for (pos i = 0; i != contents.size(); ++i)
    {
     
        os << contents[i];
        if (i % width == width - 1)
            os << std::endl;
    }
}

using namespace std;

int main()
{
     
    Screen myScreen(5, 5, 'X');
    myScreen.move(4, 0).set('#').display(cout);
    myScreen.display(cout);

    return 0;
}

7.30



/**
 * 可以同名
 * 代码多余
 */

7.31

struct X;
struct Y;

struct X {
     
    Y *p;
};

struct Y {
     
    X p;
};

7.32

#include 
#include 
#include "Screen.h"

class Window_mgr {
     
public:
    using ScreenIndex = std::vector<Screen>::size_type;

    void clear(ScreenIndex);
private:
    std::vector<Screen> screens{
     Screen(24, 80, ' ')};
};

inline
void Window_mgr::clear(ScreenIndex i)
{
     
    Screen &s = screens[i];
    s.contents = std::string(s.height * s.width, ' ');
}

7.33


/**
 * pos 未定义
 * SCreen::pos Screen::size() const
 * {
 *     return height * width;
 * }
 */

7.34


/**
 * 未定义标识符
 */

7.35

#include 
using std::string;

typedef string Type;
Type initVal(); // string

class Exercise {
     
public:
    typedef double Type; // 不允许重新定义类型名字
    Type setVal(Type); // double
    Type initVal(); // double
private:
    int val; 
};
// string            double
Type Exercise::setVal(Type parm)
{
     
    val = parm + initVal(); // Exercise::initVal();
    return val;
}

7.36


/**
 * rem 先初始化 base 未定义值
 */

struct X {
     
    X(int i, int j) : base(i), rem(base % j);
    // 换位
    int base, rem;
};

7.37

#include "../Sales_data/Sales_data.h"
#include 
using namespace std;

// istream
Sales_data first_item(cin);

int main()
{
     
    // 默认
    Sales_data next;
    // string
    Sales_data last("11111");

    return 0;
}

7.38


// 声明不提供默认实参, 定义提供
Sales_data(std::istream is& = std::cin);

7.39


/**
 * 不合法 有多个默认构造函数
 */

7.40.cc

#include 
#include 
#include "Date.h"
 
#define STR(i) (std::to_string(i))

// 日期
Date::Date() : tim(time(&tim)), t(localtime(&tim)), year(STR(t->tm_year + 1900)),
               month(STR(t->tm_mon + 1)), day(STR(t->tm_mday)), hour(STR(t->tm_hour)),
               minute(STR(t->tm_min)), second(STR(t->tm_sec)) {
      }
#undef STR

7.40.h

#ifndef DATE_H
#define DATE_H

#include 
#include 
#include 
#include 
 
// 日期
class Date{
     
friend std::ostream &operator<<(std::ostream&, const Date&);
public:
    Date();
private:
    time_t tim;
    struct tm *t;
    std::string year;
    std::string month;
    std::string day;
    std::string hour;
    std::string minute;
    std::string second;
};

#define SET std::setw(2) << std::setfill('0')

inline
std::ostream &operator<<(std::ostream &os, const Date &item)
{
     
    os << item.year << "/" << SET << item.month << "/"
       << SET << item.day << " -- " << SET << item.hour << ":"
       << SET << item.minute << ":" << SET << item.second;

    return os;
}
#undef SET

#endif

7.41.cc

#include "7_41.h"
#include 

// 成员函数

// 辅助函数

// +
Sales_data add(const Sales_data &lhs, const Sales_data &rhs)
{
     
    Sales_data sum = lhs;
    sum.combine(rhs);

    return sum;
}

// 输入
std::istream &read(std::istream &is, Sales_data &item)
{
     
    is >> item.bookNo
       >> item.units_sold
       >> item.revenue;

    return is;
}

// 输出
std::ostream &print(std::ostream &os, const Sales_data &item)
{
     
    os << item.bookNo << " "
       << item.units_sold << " "
       << item.revenue;

    return os;
}

int main()
{
     

    Sales_data data1;
    Sales_data data2(std::cin);
    Sales_data data3("xi");
    Sales_data data4("xi", 0, 0);
}

7.41.h

#ifndef SALES_DATA
#define SALES_DATA

/**
 * 2_40.h
 * 7_2.h
 */
 
#include 
#include 


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() : Sales_data("", 0, 0) {
      puts("Sales_data()"); }
    Sales_data(std::istream &is) : Sales_data() {
      puts("Sales_data(std::istream&"); read(is, *this); }
    Sales_data(const std::string &s) : Sales_data(s, 0, 0) {
      puts("Sales_data(const std::string&)"); }
    Sales_data(const std::string &s, unsigned u, double d) : bookNo(s), units_sold(u), revenue(d) 
        {
      puts("Sales_data(const std::string&, unsigned, double)"); }

    // 返回书号
    std::string isbn() const {
      return bookNo; }
    // +=
    Sales_data& combine(const Sales_data &rhs);
    // 卖出数量
    double avg_price() const {
      return units_sold ? revenue / units_sold : 0; }
private:
    // 书号
    std::string bookNo;
    // 售卖单位
    unsigned units_sold = 0;
    // 收入
    double revenue = 0.0;
};

Sales_data add(const Sales_data &lhs, const Sales_data &rhs);
std::istream &read(std::istream &is, Sales_data &item);
std::ostream &print(std::ostream &os, const Sales_data &item);

inline
Sales_data& Sales_data::combine(const Sales_data &rhs)
{
     
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;

    return *this;
}
#endif

7.42


Date::Date(std::string &ye) : Date() {
      year = ye; }

7.43

#include 
#include 

struct NoDefuault {
     
    NoDefuault(int i) : i(i) {
      }
    int i = 0;
};

struct C {
     
    C() : nd(1) {
      }
    NoDefuault nd;
};

int main()
{
     
    C c;
    printf("%d\n", c.nd.i);
    std::vector<NoDefuault> d(10, 0);
    std::vector<C> e(10);

    return 0;
}

7.44


/**
 * 不合法
 * 没有默认构造函数
 */

7.45


/**
 * 合法
 * 有默认构造函数
 */

7.46



/**
 * a 正确 提供非默认构造函数, 或默认构造函数能构造类
 * b 错误 默认实参也是默认构造函数
 * c 你喜欢
 * d 错误 引用和指针数据成员没有 合成默认构造函数
 */

7.47


/**
 * 是
 * 只有书号没意义
 * 不能拷贝初始化
 */

7.48


/**
 * 正确构造
 * 转换成 string, 正确构造
 * 
 * 毫无影响
 */

7.49


/**
 * a string 转换成 Sales_data, 传入临时量的副本
 * b string 无法转换成 Sales_data &
 * a string 转换成 Sales_data, 传给常量引用 常量成员函数不能改变 this
 */

7.50

#include 
#include 

class Person {
     
friend std::istream &read(std::istream &is, Person &item);
friend std::ostream &print(std::ostream &os, const Person &item);
public:
    // 构造函数
    Person() = default;
    explicit Person(std::istream &is) {
      read(is, *this); }
    explicit Person(const std::string &s) : name(s) {
      }
    Person(const std::string &n, const std::string &a) : name(n), address(a) {
      }
    // 获取名字
    std::string getname() const {
      return name; }
    // 获取地址
    std::string getaddress() const {
      return address; }
private:
    // 名字
    std::string name;
    // 地址
    std::string address;
};

// 辅助函数
std::istream &read(std::istream &is, Person &item);
std::ostream &print(std::ostream &os, const Person &item);

int main()
{
     
    Person p("xiao");

    return 0;
}

7.51


/**
 * const char * == string
 * int != vector
 */

7.52

#include 
#include 

using namespace std;

struct Sales_data {
     
    std::string bookNo;
    unsigned units_sold = 10;
    double revenue = 20;
};
// 没有类内初始值 这条,在C++14中已经废止

int main()
{
     
                    // 初始化列表转换成Sales_data
    Sales_data item = {
     "xi", 1, 2};

    cout << item.bookNo << item.units_sold << item.revenue << endl;

    return 0;
}

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_io(bool b) {
      io = b; }
    void set_hw(bool b) {
      hw = b; }
    void set_other(bool b) {
      other = b; }
private:
    // 硬件错误
    bool hw;
    // io 错误
    bool io;
    // 其他错误
    bool other;
};

int main()
{
     
    Debug d;

    d.set_io(false);
}

7.54



/**
 * c++11 中 constexpr 的成员函数 隐式const 不能修改
 * c++14 行
 */

7.55



/**
 * string 不是
 */

7.56


/**
 * static 声明的成员
 * 全局作用域 可以是不完全类型 可以当默认实参
 * 类的静态成员与类本身直接相关, 而不是与类的各个对象保持关联
 */

7.57.cc

#include "Account.h"

void Account::rate(double newRate)
{
     
    interestRate = newRate;
}

double Account::initRate()
{
     
    return 1.0;
}

// 定义 static 数据成员
double Account::interestRate = initRate();

7.57.h

#ifndef ACCOUNT_H
#define ACCOUNT_H

#include 

class Account {
     
public:
    Account() = default;
    Account(std::string s, double d) : owner(s), amount(d) {
      }
    // 计算数量
    double calculate() {
      return amount += amount * interestRate;}
    // 输出利率
    static double rate() {
      return interestRate; }
    // 更新利率
    static void rate(double);
private:
    // 所有者
    std::string owner;
    // 数量
    double amount = 0;
    // 利率
    static double interestRate;
    static double initRate();
};
#endif

7.58



/**
 * rate 不是常量  double Example::rate = 6.5;
 * vec 不是常量  vector Example::vec(vecSize);
 */

你可能感兴趣的:(C++,Primer(第五版),c++)