7.2 访问控制与封装
访问说明符:public,private
class和struct的区别:默认访问权限不一样,class默认所有成员是private,struct默认所有成员是public。
7.2.1 友元
类可以允许其他类或者函数访问它的非公有成员,通过令其他类或者函数(包括其他类的成员函数)成为它的友元。
声明函数作为友元,要增加一条friend关键字的函数声明。(声明只能出现在定义的内部)
友元关系不存在传递性。
友元的作用是影响访问权限,本身并非普通的声明。
class Sales_data{
friend Sales_data add(const Sals_data&, const Sales_data&);
public:
Sales_data() = default;
private:
std::string bookNo;
unsigned units_sold = 0;
}
封装的好处:
- 确保用户代码不会无意间破坏封装的对象的状态。
- 被封装的对象的类的具体实现可以很方便的改变(只看自己类内的逻辑),而不用调整用户代码。
7.3类的其他特性
等价:
typedef std::string::size_type pos
using pos = std::string::size_type
Sales_data item1; //默认初始化Sales_data类型的对象。
class Sales_data item1;
内联函数inline:inline成员函数应该与相对应的类定义在同一个头文件中。
可变数据成员mutable
class Screen{
public:
void some_member() const;
private:
mutable size_t access_ctr;
}
void Screen::some_member() const
{
++access_ctr; //记录调用次数
// 其他操作
}
尽管some_member()是一个常量成员函数,它仍然可以改变access_str的值,该成员是个可变成员,所以任何成员函数都可以改变它的值。
可以基于const重载函数
class Screen{
public:
Screen &display(sd::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 {os << contents;}
}
类的声明
class Screen;
前向声明,声明之后定义之前是一个不完全的类型。
声明之后定义之前:可以定义指向这种类型的指针或者引用,也可以声明(但不能定义)以它作为参数或返回值的函数。