C++ 类的进阶学习篇--构造函数、友元

构造函数

每个类都分别定义了它的对象被初始化的方式,类通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数便是构造函数。它的任务就是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。

默认初始化构造函数

在我们没有定义构造函数时,类会通过一个特殊的构造函数来控制默认初始化过程,这个过程叫做默认构造函数,它无需任何实参。又被称为合成的默认初始化构造函数

它会按照如下规则初始化类的数据成员

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

猜你喜欢

转载自blog.csdn.net/lovely_ke/article/details/82940445