西安免費做網(wǎng)站哪家好大連seo外包平臺
目錄
前言
封裝?
封裝的意義
struct 和 class 的區(qū)別
成員屬性設(shè)置為私有
前言
眾所周知, C++是一個面向?qū)ο蟮木幊陶Z言(面向?qū)ο蟮腃++語言的特點就是:封裝、繼、?多態(tài)),它與面向過程的C語言不通,對面向過程的初級認(rèn)識就是他強調(diào)的是一個過程,這樣說是不是還是很空洞,下面舉個例子就會好理解很多:
在面向過程中:把大象裝進(jìn)冰箱需要3步:打開冰箱門,把大象放進(jìn)去,再關(guān)上冰箱,強調(diào)的是一個求解問的步驟
在面向?qū)ο笾?/span>:把大象和冰箱看作兩個對象,然后通過操作兩個對象來把大象放到冰箱里。關(guān)注的是對象,將一件事情拆分成不同的對象,靠對象之間的交互完成。
再比如一個選課系統(tǒng)
面向過程:選課、上課? 兩個過程
面向?qū)ο?/strong>:學(xué)生、老師? 關(guān)注的是兩個類對象之間的關(guān)系
?在C++中,萬事萬物皆為對象,對象有屬性和行為
例如 :
人可以作為對象,屬性有姓名、年齡、性別、身高...,行為有走、跑、跳、吃飯...
車也可以作為對象,屬性有輪胎、方向盤、車燈...,行為有載人、放音樂、放空調(diào)...
具有相同性質(zhì)的對象,我們可以抽象成為類,人屬于人類,車屬于車類
封裝?
封裝的意義
封裝是C++面向?qū)ο笕筇攸c之一,它的主要意義就是在于將對象的屬性和行為作為一個整體,來表現(xiàn)我們的對象,另外就是對屬性和行為進(jìn)行權(quán)限的控制?
它的語法是:class 類名{ 訪問權(quán)限:屬性 / 行為 }? ?(class為定義類的關(guān)鍵字)
下面定義一個圓類,求圓的周長
#include<iostream>
using namespace std;const double PI = 3.14
//設(shè)計一個類
class Circle
{//訪問權(quán)限public: //公共權(quán)限//屬性(通常就是一些變量)int m_r; //半徑//行為(通常用函數(shù)來獲取)double calculateZC() //獲取圓的周長{return 2*PI*m_r;}
};int main()
{//通過圓類 實例化一個具體的圓(對象)Circle cl; // Circle是先前創(chuàng)建的類 cl是具體的圓對象//給圓對象的屬性進(jìn)行賦值cl.m_r = 10; //通過 . 來獲取屬性 并進(jìn)行賦值cout << "圓的周長為:"<< cl.calculateZC <<endl;system("pause");return 0;
}
以上代碼就是設(shè)計一個圓類class Circle,在這個圓類中,定義了屬性半徑m_r,以及通過函數(shù)double calculateZC創(chuàng)建一個求解圓周長的行為,并且在主函數(shù)中通過圓類實例化了一個具體的圓對象 Circle cl來訪問我們的類,cl就是我們的是實例化對象,要獲取屬性,就要使用到“.”點這個符號,通過cl.m_r來獲取半徑,同時進(jìn)行賦值,同樣,獲取周長就是cl.calculate。
那么為加深對類設(shè)計的認(rèn)識,下面再來一個例子:設(shè)計一個學(xué)生類,屬性有姓名和學(xué)號,可以給姓名和學(xué)號賦值,可以顯示學(xué)生的姓名和學(xué)號,
#include<iostream>
using namespace std;
#include<string>//設(shè)計一個學(xué)生類
class Student
{//訪問權(quán)限public: //公共權(quán)限//屬性(通常就是一些變量)string m_Name; //姓名string m_Id; //學(xué)號//行為(通常用函數(shù)來獲取)void setName(string name) //獲取學(xué)生姓名{m_Name = name;}void setId(int id) //獲取學(xué)生學(xué)號{m_Id = id;}void showStudent() //顯示學(xué)生信息{cout << "姓名:" << m_Name << "學(xué)號:" << m_Id << endl;}//除了通過在主函數(shù)里面復(fù)制的方式,還可以用函數(shù)在類的行為來進(jìn)行賦值void setName(string name) //給學(xué)生姓名賦值{m_Name = name;} };int main()
{//通過學(xué)生類 實例化一個具體的學(xué)生(對象)Student stu1; //給學(xué)生1對象的屬性進(jìn)行賦值stu1.m_Name = "張三"; stu1.m_Id = "123456789";stu1.showStudent//給學(xué)生2對象的屬性進(jìn)行賦值stu2.m_Name = "李四"; stu2.m_Id = "1234567890";stu2.showStudent//通過行為對學(xué)生姓名進(jìn)行賦值stu1.setName("張三");system("pause");return 0;
}?
?注意:? ?類中的屬性和行為統(tǒng)稱為? ?成員
? ? ? ? ? ? ? ?屬性? 也稱為? 成員屬性? ? 或? ?成員變量
? ? ? ? ? ? ? ?行為? 也稱為? 成員函數(shù)? ?或? ?成員方法
?在上面代碼中我們發(fā)現(xiàn) 每次都會在屬性和行為前面進(jìn)行權(quán)限的限制(public),這是因為在設(shè)計類時,屬性和行為放在不同的權(quán)限下,訪問權(quán)限有三種:public(公共權(quán)限)、protected(保護(hù)權(quán)限)、private(私有權(quán)限)。下面一段代碼進(jìn)行詳細(xì)解釋
公共權(quán)限 public 類內(nèi)可以訪問 類外可以訪問 保護(hù)權(quán)限 protected 類內(nèi)可以訪問 類外不可以訪問 (子類可以訪問父類中的保護(hù)內(nèi)容) 私有權(quán)限 private 類內(nèi)可以訪問 類外不可以訪問(子類不可以訪問父類中的私有內(nèi)容)
#include<iostream>
using namespace std;
#include<string>//設(shè)計一個類
class Person
{public: //公共權(quán)限string m_Name;//姓名protected: //保護(hù)權(quán)限string m_Car;//汽車private://私有權(quán)限int m_Password;//銀行卡密碼//行為(通常用函數(shù)來獲取)
public:void func() //獲取學(xué)生姓名{m_Name = "張三";m_Car= "勞斯萊斯";m_Password = 123456;}; //類內(nèi)都可以進(jìn)行訪問};int main()
{//通過類 實例化一個具體的對象Person p1; p1.m_Name = "張三" ;p1.m_Car = "勞斯萊斯"; //此時這里會出現(xiàn)錯誤 因為汽車這個屬性是保護(hù)權(quán)限,不能在類外訪問p1.m_Password = "123456"; //此時這里會出現(xiàn)錯誤 因為銀行卡密碼這個屬性是保私有權(quán)限,不能在類外訪問system("pause");return 0;
}?
struct 和 class 的區(qū)別
?在C++中struct 和 class 的唯一區(qū)別就在于 默認(rèn)的訪問權(quán)限不同,struct默認(rèn)訪問權(quán)限為公共的,class的默認(rèn)訪問權(quán)限為私有的。
?#include<iostream>
using namespace std;
#include<string>//設(shè)計一個類
class C1
{string m_Name;//當(dāng)我們不定義權(quán)限的時候,默認(rèn)是私有權(quán)限
};
//定義一個結(jié)構(gòu)體
struct S1
{string m_Name;//當(dāng)我們不定義權(quán)限的時候,默認(rèn)是共有權(quán)限
};int main()
{C1 c1;//不能進(jìn)行訪問,因為class的默認(rèn)權(quán)限是私有的,類的外部不能訪問S1 s1;//能進(jìn)行訪問,因為struct的默認(rèn)權(quán)限是共有的,類的外部也能訪問system("pause");return 0;
}??
成員屬性設(shè)置為私有
通過使用私有成員屬性,可以實現(xiàn)類的封裝,隱藏內(nèi)部實現(xiàn)細(xì)節(jié),并提供對外部世界的受控訪問。這有助于提高代碼的模塊化程度,減少代碼的耦合性,同時也方便了代碼的維護(hù)和重構(gòu)。將成員屬性設(shè)置為私有,有以下優(yōu)點:
優(yōu)點 1:將所有的成員屬性設(shè)置為私有,可以自己控制讀寫權(quán)限
優(yōu)點 2:對于寫權(quán)限,我們可以檢測數(shù)據(jù)的有效
?#include<iostream>
using namespace std;
#include<string>class Person
{
bublic:void setName(string name) //寫操作{m_Name = name;}string getName(string name) //讀操作{return m_Name;}void setAge(int age) //寫操作{m_Age = age;}string getIdol(string idol) //讀操作{return m_Idol;}private:string m_Name;// 可讀可寫int m_Age; //只寫不讀string m_Idol; //只讀不寫};int main()
{Person p;p.setName("張三");//寫操作cout << " 姓名:" << p.getName() << endl; //讀操作p.setAge(18);//寫操作cout << " 年齡:" << p.m_Age<< endl; //讀操作,此時會發(fā)生錯誤,因為我們只給了寫的權(quán)限p.m_Idol="se";//寫操作,此時會發(fā)生錯誤,因為我們沒有給寫的權(quán)限cout << " 年齡:" << p.getIdol()<< endl; //讀操作system("pause");return 0;
}??
上面這段代碼可以看看出來,我們的定義了私有屬性:name、age、idol ,私有權(quán)限在類外是不能訪問的,現(xiàn)在我們想要進(jìn)行訪問,進(jìn)行讀和寫操作,于是我們就定個公有權(quán)限的讀寫函數(shù)來獲取,寫就是setxxx(例如setName),讀就是getxxx(例如getName),對于我們定義的幾個屬性,我們只想外部寫(更改)年齡,但是不想外部讀取年齡,此時就只需要定義一個setAge函數(shù)來對年齡進(jìn)行更改,而對于偶像Idol,我們只想外部進(jìn)行讀操作,并不能對它進(jìn)行寫操作(也就是更改Idol的姓名),此時就只需要一個getIdol函數(shù)來返回我們偶像名字,并且在主函數(shù)中進(jìn)行打印,這樣外界就知道了這個人的idol是誰了,如果又讀又寫,就兩個函數(shù)都定義一個,然后在主函數(shù)進(jìn)行調(diào)用。以上就是將所有的成員屬性設(shè)置為私有,可以自己控制讀寫權(quán)限。
對于寫權(quán)限,我們可以檢測數(shù)據(jù)的有效,可以舉個例來說明,就是說 我們在寫入年齡的時候,可以進(jìn)行判斷輸入的年齡是否符合規(guī)定,比如我們在寫函數(shù)setAge()中添加一個判斷語句來設(shè)置輸入的年齡應(yīng)該是0到100之間,如果寫入的年齡超過100或低于0,那么就是無效的。
?#include<iostream>
using namespace std;
#include<string>class Person
{
bublic:void setAge(int age) //寫操作{if (age < 0 || age > 100){cout << "年齡" << age << "輸入數(shù)字無效,賦值失敗!" << endl;return;}m_Age = age;}private:string m_Name;// 可讀可寫int m_Age; //只寫不讀 (只能在0-100之間)string m_Idol; //只讀不寫};int main()
{Person p;p.setAge(180);//寫操作cout << " 年齡:" << p.m_Age<< endl; //讀操作,此時會發(fā)生錯誤,因為我們只給了寫的權(quán)限system("pause");return 0;
}??
? ?
?