C++ primer 7.2 7.3笔记

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

封装的好处:

  1. 确保用户代码不会无意间破坏封装的对象的状态。
  2. 被封装的对象的类的具体实现可以很方便的改变(只看自己类内的逻辑),而不用调整用户代码。

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;
前向声明,声明之后定义之前是一个不完全的类型。
声明之后定义之前:可以定义指向这种类型的指针或者引用,也可以声明(但不能定义)以它作为参数或返回值的函数。

posted @ 2022-10-29 16:21  227569hy  阅读(13)  评论(0)    收藏  举报