构造函数
每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数便是构造函数。它的任务就是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。
默认初始化构造函数
在我们没有定义构造函数时,类会通过一个特殊的构造函数来控制默认初始化过程,这个过程叫做默认构造函数,它无需任何实参。又被称为合成的默认初始化构造函数
它会按照如下规则初始化类的数据成员
1.如果存在类内初始值,用它来初始化成员
2.否则,默认初始化该成员
注意:只有当类内没有任何构造函数时,编译器才会自动生成默认构造函数
定义构造函数
在类内定义构造函数
新增这样几个构造函数
Sales_data() = default; //默认构造函数,如果我们需要默认的行为,那么可以通过在参数列表后写上 = default
Sales_data(const std::string &s) : bookNo(s) = {}
Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenve(p*n) {}
//构造函数的初始值列表,上述 :后面跟的是初始值列表,{}内是函数体
Sales_data(std::istream &)
//这个是在类外定义构造函数
访问控制与封装
public:定义在public说明符之后的成员在整个程序内可被访问,public定义类的接口。
private:定义在private说明符之后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private隐藏了类的实现细节
/*
1.使用class定义
2.加上构造函数*/
class Sales_data {
public:
Sales_data() = default;
Sales_data(const std::string &s, unsigned n, double p) :
bookNo(s), units_sold(n), revenue(p*n) {};
Sales_data(const std::string &s) : bookNo(s) {};
Sales_data(std::istream &);
std::string isbn() const { return bookNo; }//返回ISBN编号
Sales_data& combine(const Sales_data&); //将一个Sales_date对象加到另一个对象上去
private:
double avg_price() const
{return units_sold ? revenue / units_sold : 0;}
std::string bookNo; //ISBN编号
unsigned units_sold = 0;//销售数量
double revenue = 0.0; //销售总额
};
这次我们使用的是class定义类
那么什么时候使用class,什么时候使用struct嘞
我这样告诉你。
struct和class唯一不用的是他们的默认权限。
所以为了统一编程风格,当我们希望所有类的成员都是public时,使用struct
当我们希望成员有private时,使用class
友元
类允许其他类或战术访问它的非公有成员,方法时令其他类或者函数称为它的友元。
那么我添加下友元,上面的clss定义变为
class Sales_data {
friend Sales_data add(const Sales_data&, const Sales_data&); //执行两个Sales_date对象的加法
friend std::ostream &print(std::ostream&, const Sales_data&);//将Sales_date对象输出到ostream上
friend std::istream &read(std::ostream&, Sales_data&); //从ostream上读入到Sales_date对象
public:
Sales_data() = default;
Sales_data(const std::string &s, unsigned n, double p) :
bookNo(s), units_sold(n), revenue(p*n) {};
Sales_data(const std::string &s) : bookNo(s) {};
Sales_data(std::istream &);
std::string isbn() const { return bookNo; }//返回ISBN编号
Sales_data& combine(const Sales_data&); //将一个Sales_date对象加到另一个对象上去
private:
double avg_price() const
{return units_sold ? revenue / units_sold : 0;}
std::string bookNo; //ISBN编号
unsigned units_sold = 0;//销售数量
double revenue = 0.0; //销售总额
};
Sales_data add(const Sales_data&, const Sales_data&); //执行两个Sales_date对象的加法
std::ostream &print(std::ostream&, const Sales_data&);//将Sales_date对象输出到ostream上
std::istream &read(std::ostream&, Sales_data&); //从ostream上读入到Sales_date对象
当然友元的声明仅仅只动了访问的权限,而一个通常意义上的函数声明。如果我们希望类的用户能够掉以哦那个某个友元函数,那我们就必须在友元声明之外再专门对函数进行一次声明。
关于友元,这个哥讲的ok
https://blog.csdn.net/lejun2011/article/details/11797357?locationNum=4&fps=1