访问控制与封装

文章目录

  • 访问说明符:
  • 友元:
  • 封装好处:
class Sales_data{public://作为接口的一部分,构造函数和部分成员函数isbn,combine紧跟在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;}Sales_data &combine(const Sales_data&);private://数据成员和作为实现部分的函数跟在private说明符之后。double avg_price() const {return units_sold ? revenue/units_sold : 0;}std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;
};

访问说明符:

  • public说明符:定义在public后的成员在整个程序内可被访问,public成员定义类的接口。
  • private说明符:定义在private后的成员可以被类的成员函数访问,但是不能被使用该类的代码访问,private成员定义类的接口。

class关键字和struct关键字:

  1. 这两个关键字都可以用来定义类。
  2. 区别:struct和class的默认访问权限不同。
    1. 使用struct关键字,定义在第一个访问说明符之前的成员是public的。
    2. 使用class关键字,定义在第一个访问说明符之前的成员是private的。
    3. 一般希望定义类的所有成员是public的,用struct;全是private的用class。

友元:

class Sales_data {//为sales_data的非成员函数所做的友元声明。
friend Sales_data add(const Sales_data&, const Sales_data&);
friend std::ostream &print(std::ostream&, const Sales_data&);
friend std::istream &read(std::istream&, Sales_data&);
public:// constructorsSales_data() = default;Sales_data(const std::string &s): bookNo(s) { }Sales_data(const std::string &s, unsigned n, double p):bookNo(s), units_sold(n), revenue(p*n) { }Sales_data(std::istream &);// operations on Sales_data objectsstd::string isbn() const { return bookNo; }Sales_data& combine(const Sales_data&);double avg_price() const;
private:std::string bookNo;unsigned units_sold = 0;double revenue = 0.0;
};// nonmember Sales_data interface functions
//友元声明仅仅指定了访问权限,如果我们希望用户能调用友元函数,还需要在友元声明之外再专门对函数进行一次声明。
Sales_data add(const Sales_data&, const Sales_data&);
std::ostream &print(std::ostream&, const Sales_data&);
std::istream &read(std::istream&, Sales_data&);

类还可能有非成员函数,函数在概念上属于类,但是不定义在类中,则它一般应与类声明在同一个头文件内。这里的add,print,read函数就是非成员函数。

既然Sales_data数据成员是private的,那我们add,print,read函数就无法正常编译了。

类可以允许其他类或者函数访问它的非公有成员,方法就是令其他类或者函数称为它的友元。只需增加一条以friend关键字开始的函数声明语句。

friend Sales_data add(const Sales_data&, const Sales_data&);
friend std::ostream &print(std::ostream&, const Sales_data&);
friend std::istream &read(std::istream&, Sales_data&);

友元声明只能出现在类的内部,但是具体位置不限。

封装好处:

  1. 被封装的类的具体实现细节可以随意改变,无需调整用户级别的代码。
  2. 确保用户代码不会无意间破坏封装对象的状态。

c++ 访问控制与封装相关推荐

  1. C++ 类和对象(一):类的概念、类的访问控制和封装、类对象模型、this指针

    类的概念 类的访问控制和封装 类的对象模型 this指针 类的概念 在C++中,类可以说是最重要的东西,因为C++一开始的定位就是c with class,也正是因为引入了类,才让c++从c的面向过程 ...

  2. 类的概念、成员函数的定义方式、类的访问控制和封装、类的大小、this指针

    文章目录 类的概念 struct class class和struct的区别是什么呢? 类中成员函数的两种定义方式 声明和定义都在类中 声明和定义分离 类的访问控制和封装 类的封装特性 类的大小 结构 ...

  3. 【c++ primer, 5e】访问控制与封装

    练习 7.16 无,类的接口定义在public说明符之后,类的实现细节定义在private说明符之后. 7.17 有.类成员的默认访问权限不同.class的类成员默认为private,struct的则 ...

  4. Primer c++ 第5版pdf

    下载地址:网盘下载 内容简介  · · · · · · 这本久负盛名的 C++经典教程,时隔八年之久,终迎来史无前例的重大升级.除令全球无数程序员从中受益,甚至为之迷醉的--C++ 大师 Stanle ...

  5. 《C++ Primer 5th》笔记(7 / 19):类

    文章目录 定义抽象数据类型 设计Sales_data类 关键概念:不同的编程角色 使用改进的Sales_data类 定义改进的Sales_data类 定义成员函数 引入this 引入const成员函数 ...

  6. C++基础部分-学习笔记

    目录 1 变量及基本类型 1.1 基本内置类型 1.1.1 算术类型 1.1.2 类型转换 1.1.3 转义序列 2 变量 2.1 何为对象 2.2 列表初始化 2.3 默认初始化 2.4 变量声明与 ...

  7. c++primer学习笔记

    c++ primer 5e学习笔记 第1章 1.标准库 类型和函数的集合,每个c++编译器都必须支持. 2.()运算符:调用运算符.跟随在函数名后,起调用函数的作用 第2章 1.p32:char在一些 ...

  8. C++ primer读书记录包括第一部分和第二部分 第二十二次更新2021.9.10

    需要对程序进行恰当的缩进保持程序的可读性 第一章 开始 cout<<c1<<endl;可以视为(cout<<c1)<<endl; cin>> ...

  9. Java第三章 面向对象(上)

    面向对象(上) 思想 类和对象 类的定义(class) 对象的创建和使用 对象类型作为方法的参数 对象类型作为方法的返回值 成员和局部变量区别 四种访问控制权限 封装性 private关键字 this ...

最新文章

  1. R卡方独立性检验(Chi-Square Test of Independence)
  2. 计算机/ARM 系统
  3. 英巴卡迪诺新年战略:支持Linux提供中文手册
  4. php html转化为pdf,PHP将html转换成PDF文件
  5. 剑指offer八:跳台阶
  6. 如何清除SQL数据库日志,清除后对数据库有什么影响
  7. 内置函数、匿名函数,递归函数
  8. 忘记redhat linux root密码怎么办
  9. Windows访问Linux的Tomcat,显示无法连接
  10. 02-普通轮播图-上下滚动
  11. 网络(9)-HTTPS协议
  12. 不让EditText打开就获取焦点
  13. CMake 安装与卸载
  14. jsp连接MYSQL数据库教程(文字+图)
  15. 谈谈优化JDBC数据库编程(转)
  16. 抖音的服务器究竟有多大
  17. 个推大数据:3月线上消费率先恢复,在线购物APP迎来春天
  18. 工业物联网实施的6个常见误解
  19. mysql数据生成词云图,7个好用的在线词云生成工具
  20. python平均分及格率优秀率_跪求:请问怎样统计均分、优秀率、及格率、低分率的问题...

热门文章

  1. 第一次使用Sourcetree成功上传gitee记录
  2. Modbus通信协议之CRC16冗余循环校验函数
  3. Opencv 深度学习识别性别和检测年龄
  4. ASP.NET Web API 中的属性路由
  5. Linux防火墙屏蔽ip6,观点|Linux 发行版们应该禁用 IPv4 映射的 IPv6 地址吗?
  6. java文本框背景_用Java编写小程序(包含组合框下拉和文本框)变换背景颜色
  7. 天天向上续python3.3_Linux 配置系列 四 python3
  8. eureka 集群失败的原因_Eureka集群的那些坑
  9. 时光手帐如何打印 时光手帐打印的方法
  10. 微软Dev版Win11下周不更新 或为能跑安卓APP的新版做准备