第7章 类

  • 使用类定义自己的数据类型
  • 本章主要关注数据抽象→将对象的具体实现与对象所能执行操作分离开来

零、术语表

  • 聚合类
  • 类:C++提供的自定义数据类型的机制。类可以包含数据、函数和类型成员。一个类定义一种新的类型和一个新的作用域
  • 类的作用域:每个类定义一个作用域,类中定义的成员函数可能使用定义语句之后的名字。
  • 常量成员函数:修改隐式this参数为指向常量的常量指针,从而使得该成员函数可以由常量对象调用,同时,在其中不能修改对象的普通数据成员
  • 构造函数初始值列表:在构造函数体执行之前首先用初始值列表中的值初始化数据成员。未经初始值列表初始化的成员将被默认初始化
  • 显示构造函数:可以用一个单独的实参调用但是不能用于隐式转换的构造函数,explicit

一、定义抽象数据类型

1.设计sales_data类

  1. 定义改进的sales_data类
  • 引入this:
    • 成员函数通过一个名为this的额外的隐式参数来访问调用它的对象,用求求该函数的对象地址初始化this
    • this的目的总是指向“这个”对象,所以this是一个常量指针
  • 引入const成员函数→常亮成员函数
    • string isbn() const {return this->bookNo;}
    • const的作用是修改隐式this指针的类型→由指向非常量对象的常量指针改为指向常量对象的常量指针
    • 常量成员函数不能改变对象的内容
  1. 定义类相关的非成员函数
  2. 构造函数
  • 初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数
  • 默认构造函数→无实参的构造函数
  • 合成默认构造函数→编译器创建的构造函数
    • 如果存在类内初始值,则用类内初始值初始化
    • 否则,默认初始化
    • 只有当类没有声明任何构造函数时,编译器才会自动的生成默认构造函数
    • 有些类的默认构造函数可能会执行错误的操作→定义在块中的内置类型或者复合类型(如数组和指针)的对象被默认初始化→同样适用于默认初始化的内置类型成员→如果类中包含有内置类型或者复合类型成员,只有当这些成员全都被赋予了类内初始值,才能对该类使用合成默认构造函数
  • =default→要求编译器生成构造函数→如果=default在类的内部,则默认构造函数是内联的,否则不是内联的??
  • 初始值列表:按照数据成员在类中出现的先后顺序初始化
  1. 拷贝、赋值和析构
  • 拷贝:初始化变量或者传值参数或者返回一个对象
  • 赋值:使用赋值运算符
  • 析构:对象不再存在时执行销毁的操作:
    • 局部对象会在创建它的块结束时被销毁
    • vector对象被销毁时,存储在其中的对象也会被销毁、
  • 合成版本:对对象的每个成员执行拷贝、赋值和销毁操作

二、访问控制与封装

  • 访问控制:public、private
  • 封装的优点:
    • 确保用户代码不会无意间破坏封装对象的状态
    • 被封装的类的具体实现细节可以随时改变,而无需调整用户级别的代码。
  • 友元
    • 类可以允许其他类或者函数访问它的非公有成员,方法是令其它类或者函数成为它的友元
    • friend关键字开始的函数声明语句

三、类的其它特性

  1. 类成员再探
  • 类类型成员:类可以自定义某种类型在类中的别名
public:
 typedef std::string::size_type pos;
  1. 返回*this的成员函数
  2. 类类型
  3. 友元再探

四、类的作用域

五、构造函数再探

  1. 构造函数初始值列表
  • 直接初始化数据成员 VS 先初始化再赋值→尽量选择前者
  • 构造函数的初始值有时必不可少
    • 引用
    • const 成员
    • 某些没有默认构造函数的类
  • 按照在类中定义的顺序初始化
  1. 委托构造函数
  2. 默认构造函数的作用
  • 当对象被默认初始化或者值初始化时自动执行默认构造函数

六、类的静态成员

  • 作用:类的静态成员存在于任何对象之外
    • 对象中不包含任何与静态数据成员有关的数据
    • 静态成员函数不与任何对象绑定在一起,不包含this指针
  • 使用:
    • 使用作用域运算符直接访问
    • 使用类的对象、引用或者指针来访问
    • 成员函数直接使用
  • 一般来说,不能在类的内部初始化静态成员,必须在类的外部定义和初始化每个静态成员
  • 一旦被定义,就一直存在于程序的整个生命周期中
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容