C++中類的三種訪問權(quán)限解析:private、public與protect
C++類的三種訪問權(quán)限:private、public與protect
類與面向?qū)ο?/h3>
C++中可以定義一個(gè)類。
定義一個(gè)類,其實(shí)就是把一堆實(shí)體的共同特征給提取出來(lái)。這種面向?qū)ο蠖皇敲嫦蜻^程的解決問題的思想,大大提升了復(fù)雜大型軟件的開發(fā)效率。
比如在游戲開發(fā)中,需要生成一批屬性相近、行為相似的怪物,那我們可以定義一個(gè)怪物類:
class Monster { ??? ?private: ?? ??? ?//私有類型成員 ??? ??? ?int attack = 15;?? ?//攻擊力屬性 ??? ?public:?? ??? ??? ?//公有類型成員 ? ?? ? ? ?? ??? ?int health = 100;?? ?//生命值屬性 ??? ??? ?void strike ( ) { //怪物對(duì)玩家進(jìn)行一次攻擊 ??? ??? ?...... ?? ??? ?}?? ? ??? ??? ?void recover( ) { //怪物回血,并提高自身攻擊力 ??? ??? ??? ?if (health <= 95) health += 5; ? ?? ??? ??? ?attack += 5; ?? ??? ?}??
我們知道,一個(gè)類中可以有兩種成員在里面:類中成員變量和類中成員函數(shù)。成員變量用于描述類的靜態(tài)屬性,如上述的 health 和 attack;成員函數(shù)其實(shí)就是類的動(dòng)態(tài)行為,比如上述的strike()和recover()。
補(bǔ)充一下:函數(shù),本質(zhì)上一串能夠完成特定行為的代碼。
例如其中strike()可以使怪物對(duì)玩家造成傷害(改變玩家生命值);recover()可以恢復(fù)一定量的生命值并提高攻擊力。
如果想要增加游戲難度,則可以增加怪物類中strike()和recover()調(diào)用頻率,或者提高h(yuǎn)ealth和attack的初始值,這些操作在C++中都很容易做到。這種面向?qū)ο蟮木幊趟枷?,讓一些從面向過程的角度看來(lái)十分抽象的行為,都能夠用C++比較輕松地實(shí)現(xiàn)。
那么,如此便夠了么??jī)H僅用成員變量和成員函數(shù)便可以完成許多復(fù)雜操作,我們不應(yīng)該竊喜么?
三種訪問權(quán)限
private與public
上述代碼中的 private 和 public 是怎么回事?他們的存在有什么意思?
private
代表類內(nèi)私有成員,僅有類內(nèi)函數(shù)可以訪問private,類外一切函數(shù)(包括繼承者)均不可訪問private成員。public
代表類內(nèi)公有成員,無(wú)論類內(nèi)還是類外(包括繼承者)的函數(shù)都可以訪問public成員。
通過這兩個(gè)關(guān)鍵字,我們實(shí)現(xiàn)了對(duì)類內(nèi)成員的訪問權(quán)限控制。在一些特定情況下,訪問權(quán)限控制十分方便。比如在上述代碼中,我們將怪物的攻擊力attack設(shè)置為private,這樣就只有類內(nèi)的recover()函數(shù)能夠訪問attack屬性;將生命值health設(shè)置為public,于是當(dāng)玩家對(duì)怪物進(jìn)行攻擊時(shí),health也能被玩家類player的攻擊函數(shù)訪問而減小。
- 除此以外,還有另一個(gè)關(guān)鍵字
protect
(即保護(hù)成員),主要用在類的繼承中。如果有任何變量或函數(shù)被聲明為protect,那么這些保護(hù)成員可以被類的繼承者中成員函數(shù)訪問,而無(wú)法被類外任何函數(shù)訪問。因?yàn)檫@個(gè)關(guān)鍵字涉及繼承機(jī)制,稍微有點(diǎn)復(fù)雜,所以我們留到下次。
關(guān)于類的訪問權(quán)限(控制權(quán)限)的區(qū)別
C++中類的訪問權(quán)限有三種,分別是public公共權(quán)限,protected保護(hù)權(quán)限,private私有權(quán)限。將成員屬性和成員方法放到不同的訪問權(quán)限中加以實(shí)際控制。
三種成員控制權(quán)限的區(qū)別
- 在公共權(quán)限內(nèi)的成員類內(nèi)可以訪問,類外也可以訪問。
- 在保護(hù)權(quán)限內(nèi)的成員類內(nèi)可以訪問,類外不可以訪問。
- 在私有權(quán)限內(nèi)的成員類內(nèi)可以訪問,類外不可以訪問。
代碼示例
#include <iostream> using namespace std; class peo { public: ? ? ? ? ? ? ? ?//公共權(quán)限 類內(nèi)類外可以訪問 ?? ?string name; protected: ? ? ? ? ? ? //保護(hù)權(quán)限,類內(nèi)可以訪問,類外不可以訪問 ?? ?string House; private: ? ? ? ? ? ? ? //私有權(quán)限,類內(nèi)可以訪問,類外不可以訪問 ?? ?string car; public: ?? ?void lei() { ?? ??? ?name = "老張"; ?? ??? ?House = "張家"; ? ? ? ?//保護(hù)權(quán)限的類內(nèi)訪問 ?? ??? ?car = "長(zhǎng)城"; ? ? ? ? ?//私有權(quán)限的類內(nèi)訪問 ?? ?} }; ? int main() { ?? ?peo p; ?? ?p.name = "小張"; ? ? ? ? ? ? ? ? ?? ??? ?//p.house="小張家"; 保護(hù)權(quán)限類外不可以訪問 ?? ??? ?//p.car="長(zhǎng)城plus"; 私有權(quán)限類外不可以訪問 ? ?? ??? ?return 0; }
小結(jié)一下:通過對(duì)不同成員控制權(quán)限的了解和使用,在實(shí)際項(xiàng)目中可以根據(jù)自己的需求選擇相應(yīng)的權(quán)限并寫上相應(yīng)的接口對(duì)類內(nèi)成員進(jìn)行調(diào)用。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
數(shù)據(jù)結(jié)構(gòu)與算法 排序(冒泡,選擇,插入)
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法 排序(冒泡,選擇,插入)的相關(guān)資料,這里對(duì)冒泡,選擇和插入都做有實(shí)例,需要的朋友可以參考下2017-07-07C++?獲取當(dāng)前正在運(yùn)行函數(shù)的名稱
本文主要介紹了C++獲取當(dāng)前正在運(yùn)行函數(shù)的名稱,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04C/C++實(shí)現(xiàn)重置文件時(shí)間戳
這篇文章主要為大家詳細(xì)介紹了C/C++實(shí)現(xiàn)重置文件時(shí)間戳的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以參考一下2023-11-11OpenCV實(shí)戰(zhàn)之基于Hu矩實(shí)現(xiàn)輪廓匹配
這篇文章主要介紹了利用C++ OpenCV實(shí)現(xiàn)基于Hu矩的輪廓匹配,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,感興趣的可以學(xué)習(xí)一下2022-01-01C語(yǔ)言實(shí)現(xiàn)繪制立體餅圖的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用C語(yǔ)言實(shí)現(xiàn)繪制立體餅圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03C語(yǔ)言實(shí)現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07