首页 > 其他分享 >笔记 -- 第七章

笔记 -- 第七章

时间:2024-11-27 22:11:45浏览次数:7  
标签:const 函数 -- 成员 定义 笔记 第七章 类型 构造函数

第七章 类(class)

定义抽象数据类型

  • 类背后的基本思想:数据抽象(data abstraction)和封装(encapsulation)。
  • 数据抽象是一种依赖于接口(interface)实现(implementation)分离的编程技术。

类成员(Member)

  • 必须在类的内部声明,不能在其他地方增加成员。
  • 成员可以是数据、函数、类型别名。

类的成员函数

  • 成员函数的声明必须在类的内部。
  • 成员函数的定义既可以在类的内部也可以在外部。
  • 使用点运算符. 调用成员函数。
  • 必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式。
  • ConstRef::ConstRef(int ii): i(ii), ci(i), ri(ii) { }
  • 默认实参:Sales_item(const std::string &book): isbn(book), units_sold(0), revenue(0.0) { }
  • *this
    • 每个成员函数都有一个额外的,隐含的形参this
    • this总是指向当前对象,因此this是一个常量指针。
    • 形参表后面的const,改变了隐含的this形参的类型,如bool same_isbn(const Sales_item &rhs) cosnt,这种函数称为“常量成员函数”(this指向的当前对象是常量)。
    • return *this; 可以让成员函数连续调用。
    • 普通的非const成员函数:this是指向类类型的const指针(可以改变this所指向的值,不能改变this保存的地址)。
    • const成员函数:this是指向const类类型的const指针(既不能改变this所指向的值,也不能改变this保存的地址)。

非成员函数

  • 和类相关的非成员函数,定义和声明都应该在类的外部。

类的构造函数

  • 类通过一个或者几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数
  • 构造函数是特殊的成员函数。
  • 构造函数放在类的public部分。
  • 与类同名的成员函数。
  • Sales_item():units_sold(0), revenue(0.0){}
  • =default要求编译器合成默认的构造函数。(C++11)
  • 初始化列表:冒号和花括号之间的代码:Sales_item():units_sold(0), revenue(0.0){}

访问控制与封装

  • 访问说明符(access specifiers)
    • public: 定义在public后面的成员在整个程序内可以被访问;public成员定义类的接口。
    • private: 定义在private后面的成员可以被类的成员函数访问,但不能被使用该类的代码访问;
      private隐藏了类的实现细节。
  • 使用class或者struct: 都可以被用于定义一个类。唯一的区别在于访问权限。
    • 使用class: 在第一个访问说明符之前的成员是private的。
    • 使用struct: 在第一个访问说明符之前的成员是public的。

友元

  • 允许特定的非成员函数访问一个类的私有成员.
  • 友元的声明以关键字friend开始。friend Sales_data add(cosnt Sales_data&, const Sales_data&); 表示非成员函数add`可以访问类的非公有成员。
  • 常将友元声明成组地放在类定义的开始或者结尾
  • 类之间的友元:
    • 如果一个类指定了友元类,则友元类的成员函数可以访问此类包括非公有成员在内的所有成员。

封装的益处

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

类的其他特性

  • 成员函数作为内联函数 inline
    • 在类的内部,常有一些规模较小的函数适合于被声明成内联函数。
    • 定义在类内部的函数是自动内联的。
    • 在类外部定义的成员函数,也可以在声明时显式地加上inline
  • 可变数据成员(mutable data member):
    • mutable size_t access_ctr;
    • 永远不会是const,即使它是const对象的成员。
  • 类类型:
    • 每个类定义了唯一的类型。

类的作用域

  • 每个类都会定义它自己的作用域。在类的作用域之外,普通的数据和函数成员只能由引用、对象、指针使用成员访问运算符来访问。
  • 函数的返回类型通常在函数名前面,因此当成员函数定义在类的外部时,返回类型中使用的名字都位于类的作用域之外。
  • 如果成员使用了外层作用域中的某个名字,而该名字代表一种类型,则类不能在之后重新定义该名字。
  • 类中的类型名定义都要放在一开始。

构造函数再探

  • 构造函数初始值列表:
    • 类似python使用赋值的方式有时候不行,比如const或者引用类型的数据,只能初始化,不能赋值。(注意初始化和赋值的区别)
    • 最好让构造函数初始值的顺序和成员声明的顺序保持一致。
    • 如果一个构造函数为所有参数都提供了默认参数,那么它实际上也定义了默认的构造函数。

委托构造函数 (delegating constructor, C++11)

  • 委托构造函数将自己的职责委托给了其他构造函数。
  • Sale_data(): Sale_data("", 0, 0) {}

隐式的类型转换

  • 如果构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制。这种构造函数又叫转换构造函数(converting constructor)。
  • 编译器只会自动地执行仅一步类型转换。
  • 抑制构造函数定义的隐式转换:
    • 将构造函数声明为explicit加以阻止。
    • explicit构造函数只能用于直接初始化,不能用于拷贝形式的初始化。

聚合类 (aggregate class)

  • 满足以下所有条件:
    • 所有成员都是public的。
    • 没有定义任何构造函数。
    • 没有类内初始值。
    • 没有基类,也没有virtual函数。

字面值常量类

  • constexpr函数的参数和返回值必须是字面值。
  • 字面值类型:除了算术类型、引用和指针外,某些类也是字面值类型。
  • 数据成员都是字面值类型的聚合类是字面值常量类。
  • 如果不是聚合类,则必须满足下面所有条件:
    • 数据成员都必须是字面值类型。
    • 类必须至少含有一个constexpr构造函数。
    • 如果一个数据成员含有类内部初始值,则内置类型成员的初始值必须是一条常量表达式;或者如果成员属于某种类类型,则初始值必须使用成员自己的constexpr构造函数。
    • 类必须使用析构函数的默认定义,该成员负责销毁类的对象。

类的静态成员

  • static数据成员存在于类类型的每个对象中。
  • static数据成员独立于该类的任意对象而存在。
  • 每个static
  • 数据成员是与类关联的对象,并不与该类的对象相关联。
  • 声明:
    • 声明之前加上关键词static
  • 使用:
    • 使用作用域运算符::直接访问静态成员:r = Account::rate();
    • 也可以使用对象访问:r = ac.rate();
  • 定义:
    • 在类外部定义时不用加static
  • 初始化:
    • 通常不在类的内部初始化,而是在定义时进行初始化,如double Account::interestRate = initRate();
    • 如果一定要在类内部定义,则要求必须是字面值常量类型的constexpr

标签:const,函数,--,成员,定义,笔记,第七章,类型,构造函数
From: https://www.cnblogs.com/sys-123456/p/18573152

相关文章

  • spring(二)IOC案例和DI案例
    一、IOC案例实现步骤:第一步、使用Maven导入Spring坐标<dependencies><!--导入spring的坐标spring-context--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><v......
  • 重新振作第七天----日常小记
    我是个纠结的人,经常纠结于过往的一些事情当中。所以,依旧在纠结的状态当中,总是回忆起之前的一些失败。念念不忘,必有回响。但是不忘的是过去,回响未必是正面的。目录背六级单词写操作系统实验报告软件工程作业移动应用开发思政报告数据库实验报告退役败犬的每日一题(1-2)背六级单词......
  • 前端html自定义元素,拓展元素
    拓展基础元素功能用法is使用<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><linkrel="icon"href="/favicon.ico"><metaname="viewport"content="width=device......
  • 初学者如何对大模型进行微调?
    粗略地说,大模型训练有四个主要阶段:预训练、有监督微调、奖励建模、强化学习。预训练消耗的时间占据了整个训练pipeline的99%,其他三个阶段是微调阶段,更多地遵循少量GPU和数小时或数天的路线。预训练对于算力和数据的要求非常高,对于普通开发者来说基本上不用考虑了。对于......
  • 《AliCoCo: Alibaba E-commerce Cognitive Concept Net》中文校对版
    文章汉化系列目录文章目录文章汉化系列目录摘要引言2概述3分类体系4原始概念4.1词汇挖掘4.2上位词发现4.2.1基于模式的方法4.2.2投影学习4.2.3主动学习5电子商务概念5.1标准5.2生成5.2.1候选项生成5.2.2分类5.3理解5.3.1文本增强概念编码器5.3.2模......
  • AI人工智能时代下,产品经理该如何跟上发展节奏?
    目前,人工智能还是一个学术密集型以及技术密集型的领域,其中最耀眼的角色当属研究人员和工程师。这样的背景下,大量的资讯和材料都指向了工程师受众。那么,对于产品经理来说,如何在这个领域中调整自己的认知和状态,跟上发展的节奏呢?在如今的科技行业中,人工智能的普及已成显著趋......
  • JAVA开源毕业设计 渔具租赁系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T005,文末自助获取源码\color{red}{T005,文末自助获取源码}......
  • JAVA开源毕业设计 历史学习网站 Vue.JS+SpringBoot+MySQL
    本文项目编号T004,文末自助获取源码\color{red}{T004,文末自助获取源码}......
  • 【C++习题】16.滑动窗口_最小覆盖子串
    文章目录题目链接:题目描述:解法C++算法代码:图解题目链接:76.最小覆盖子串题目描述:解法暴力解法:列出所有符合要求的字串,然后比较大小。滑动窗口+哈希表比如,如果已经符合要求了那么left右移一位的话,right需要移动吗?left指向的地方恰好有符合t的字符,-......
  • JavaApi.Dao模式
    Dao模式回顾增删改连接对象执行对象查连接对象执行对象结果集项目结构---包命名的规范com.zking.util:提供工具类和辅助方法,增强代码的复用性和可维护性。(帮助类)com.zking.pojo:存放实体类,表示业务对象,确保数据的一致性和完整性。com.zking.dao:负责数据访......