- 使用類定義自己的數(shù)據(jù)類型
- 本章主要關(guān)注數(shù)據(jù)抽象→將對(duì)象的具體實(shí)現(xiàn)與對(duì)象所能執(zhí)行操作分離開來
零沿后、術(shù)語表
- 聚合類
- 類:C++提供的自定義數(shù)據(jù)類型的機(jī)制磷脯。類可以包含數(shù)據(jù)、函數(shù)和類型成員。一個(gè)類定義一種新的類型和一個(gè)新的作用域
- 類的作用域:每個(gè)類定義一個(gè)作用域廉邑,類中定義的成員函數(shù)可能使用定義語句之后的名字。
- 常量成員函數(shù):修改隱式this參數(shù)為指向常量的常量指針傅寡,從而使得該成員函數(shù)可以由常量對(duì)象調(diào)用廊敌,同時(shí),在其中不能修改對(duì)象的普通數(shù)據(jù)成員
- 構(gòu)造函數(shù)初始值列表:在構(gòu)造函數(shù)體執(zhí)行之前首先用初始值列表中的值初始化數(shù)據(jù)成員因妙。未經(jīng)初始值列表初始化的成員將被默認(rèn)初始化
- 顯示構(gòu)造函數(shù):可以用一個(gè)單獨(dú)的實(shí)參調(diào)用但是不能用于隱式轉(zhuǎn)換的構(gòu)造函數(shù)痰憎,explicit
一、定義抽象數(shù)據(jù)類型
1.設(shè)計(jì)sales_data類
- 定義改進(jìn)的sales_data類
- 引入this:
- 成員函數(shù)通過一個(gè)名為this的額外的隱式參數(shù)來訪問調(diào)用它的對(duì)象攀涵,用求求該函數(shù)的對(duì)象地址初始化this
- this的目的總是指向“這個(gè)”對(duì)象铣耘,所以this是一個(gè)常量指針
- 引入const成員函數(shù)→常亮成員函數(shù)
- string isbn() const {return this->bookNo;}
- const的作用是修改隱式this指針的類型→由指向非常量對(duì)象的常量指針改為指向常量對(duì)象的常量指針
- 常量成員函數(shù)不能改變對(duì)象的內(nèi)容
- 定義類相關(guān)的非成員函數(shù)
- 構(gòu)造函數(shù)
- 初始化類對(duì)象的數(shù)據(jù)成員,無論何時(shí)只要類的對(duì)象被創(chuàng)建汁果,就會(huì)執(zhí)行構(gòu)造函數(shù)
- 默認(rèn)構(gòu)造函數(shù)→無實(shí)參的構(gòu)造函數(shù)
- 合成默認(rèn)構(gòu)造函數(shù)→編譯器創(chuàng)建的構(gòu)造函數(shù)
- 如果存在類內(nèi)初始值涡拘,則用類內(nèi)初始值初始化
- 否則,默認(rèn)初始化
- 只有當(dāng)類沒有聲明任何構(gòu)造函數(shù)時(shí)据德,編譯器才會(huì)自動(dòng)的生成默認(rèn)構(gòu)造函數(shù)
- 有些類的默認(rèn)構(gòu)造函數(shù)可能會(huì)執(zhí)行錯(cuò)誤的操作→定義在塊中的內(nèi)置類型或者復(fù)合類型(如數(shù)組和指針)的對(duì)象被默認(rèn)初始化→同樣適用于默認(rèn)初始化的內(nèi)置類型成員→如果類中包含有內(nèi)置類型或者復(fù)合類型成員鳄乏,只有當(dāng)這些成員全都被賦予了類內(nèi)初始值,才能對(duì)該類使用合成默認(rèn)構(gòu)造函數(shù)
- =default→要求編譯器生成構(gòu)造函數(shù)→如果=default在類的內(nèi)部棘利,則默認(rèn)構(gòu)造函數(shù)是內(nèi)聯(lián)的橱野,否則不是內(nèi)聯(lián)的?善玫?
- 初始值列表:按照數(shù)據(jù)成員在類中出現(xiàn)的先后順序初始化
- 拷貝水援、賦值和析構(gòu)
- 拷貝:初始化變量或者傳值參數(shù)或者返回一個(gè)對(duì)象
- 賦值:使用賦值運(yùn)算符
- 析構(gòu):對(duì)象不再存在時(shí)執(zhí)行銷毀的操作:
- 局部對(duì)象會(huì)在創(chuàng)建它的塊結(jié)束時(shí)被銷毀
- vector對(duì)象被銷毀時(shí)密强,存儲(chǔ)在其中的對(duì)象也會(huì)被銷毀、
- 合成版本:對(duì)對(duì)象的每個(gè)成員執(zhí)行拷貝蜗元、賦值和銷毀操作
二或渤、訪問控制與封裝
- 訪問控制:public、private
- 封裝的優(yōu)點(diǎn):
- 確保用戶代碼不會(huì)無意間破壞封裝對(duì)象的狀態(tài)
- 被封裝的類的具體實(shí)現(xiàn)細(xì)節(jié)可以隨時(shí)改變奕扣,而無需調(diào)整用戶級(jí)別的代碼薪鹦。
- 友元
- 類可以允許其他類或者函數(shù)訪問它的非公有成員,方法是令其它類或者函數(shù)成為它的友元
- friend關(guān)鍵字開始的函數(shù)聲明語句
三惯豆、類的其它特性
- 類成員再探
- 類類型成員:類可以自定義某種類型在類中的別名
public:
typedef std::string::size_type pos;
- 返回*this的成員函數(shù)
- 類類型
- 友元再探
四池磁、類的作用域
五、構(gòu)造函數(shù)再探
- 構(gòu)造函數(shù)初始值列表
- 直接初始化數(shù)據(jù)成員 VS 先初始化再賦值→盡量選擇前者
- 構(gòu)造函數(shù)的初始值有時(shí)必不可少
- 引用
- const 成員
- 某些沒有默認(rèn)構(gòu)造函數(shù)的類
- 按照在類中定義的順序初始化
- 委托構(gòu)造函數(shù)
- 默認(rèn)構(gòu)造函數(shù)的作用
- 當(dāng)對(duì)象被默認(rèn)初始化或者值初始化時(shí)自動(dòng)執(zhí)行默認(rèn)構(gòu)造函數(shù)
六楷兽、類的靜態(tài)成員
- 作用:類的靜態(tài)成員存在于任何對(duì)象之外
- 對(duì)象中不包含任何與靜態(tài)數(shù)據(jù)成員有關(guān)的數(shù)據(jù)
- 靜態(tài)成員函數(shù)不與任何對(duì)象綁定在一起地熄,不包含this指針
- 使用:
- 使用作用域運(yùn)算符直接訪問
- 使用類的對(duì)象、引用或者指針來訪問
- 成員函數(shù)直接使用
- 一般來說芯杀,不能在類的內(nèi)部初始化靜態(tài)成員端考,必須在類的外部定義和初始化每個(gè)靜態(tài)成員
- 一旦被定義,就一直存在于程序的整個(gè)生命周期中