C++深入探索類和對(duì)象之封裝及class與struct的區(qū)別
封裝的意義
封裝是C++三大面向?qū)ο笾?/p>
意義:
1、設(shè)計(jì)類的時(shí)候,屬性和行為寫在一起,表現(xiàn)事物
2、類在設(shè)計(jì)時(shí),可以把屬性和行為放在不同的權(quán)限下,加以控制
語法:class 類名 {訪問權(quán)限:屬性 / 行為};
示例1:設(shè)計(jì)一個(gè)直角三角形,并求解他的面積
#include<iostream> using namespace std; //class代表設(shè)計(jì)一個(gè)類,后面跟著的是類名 class taiAngle { public: //訪問權(quán)限 公共的權(quán)限 //屬性 int m_a;//直角邊a int m_b;//直角邊b //行為 //獲取三角形面積 double calculate() { return (m_a*m_b)/2; } }; int main() { //通過三角形類,創(chuàng)建三角形的對(duì)象 // c1就是一個(gè)具體的三角形 taiAngle c1; c1.m_a = 10; //給三角形兩邊進(jìn)行賦值操作 c1.m_b = 10; cout << "三角形的面積為: " << c1.calculate() << endl;//調(diào)用方法 system("pause"); return 0; }
示例2:設(shè)計(jì)一個(gè)學(xué)生類,屬性有姓名和學(xué)號(hào),可以給姓名和學(xué)號(hào)賦值,顯示學(xué)生的姓名和學(xué)號(hào)
//學(xué)生類 class Student { public: void setName(string name) { m_name = name; } void setID(int id) { m_id = id; } void showStudent() { cout << "name:" << m_name << " ID:" << m_id << endl; } private: string m_name; int m_id; }; int main() { Student stu; stu.setName("馬可波羅"); stu.setID(250); stu.showStudent(); system("pause"); return 0; }
在第二個(gè)案例中,姓名和學(xué)號(hào)是不會(huì)被直接訪問的,主函數(shù)中我們創(chuàng)建了stu學(xué)生類對(duì)象,但是我們輸入“stu."時(shí)不會(huì)出現(xiàn)m_name和m_id的提示,這就牽扯到了訪問權(quán)限的知識(shí)點(diǎn),處于私有權(quán)限的屬性只能靠成員方法加以控制,繼續(xù)往下看
訪問權(quán)限
public 公共權(quán)限:
成員:類內(nèi)可以訪問,類外可以訪問
任何一種繼承,子類可以訪問父類的公共成員
保護(hù)權(quán)限protected
成員:類內(nèi)可以訪問,類外不可以訪問
任何一種繼承,子類可以訪問父類的保護(hù)成員
私有權(quán)限private
成員:類內(nèi)可以訪問,類外不可以訪問。
任何一種繼承,子類不可以訪問父類的私有成員
示例:
class Person { //姓名 公共權(quán)限 public: string m_Phone; //手機(jī) 保護(hù)權(quán)限 protected: string m_Phone; //銀行卡密碼 私有權(quán)限 private: int m_Password; public: void display(); }; void Person::display() { m_Name = "張三"; m_Phone = "華為"; m_Password = 123456; } int main() { Person p; p.m_Name = "李四"; //p.m_Phone = "iPhone 13"; //保護(hù)權(quán)限類外訪問不到 //p.m_Password = 123; //私有權(quán)限類外訪問不到 system("pause"); return 0; }
這個(gè)案例中定義了三種權(quán)限的屬性,只有punlic:權(quán)限下的屬性和成員函數(shù)可以在類外被調(diào)用;這里的display方法我在public:權(quán)限下只是聲明的一下,然后在類外完成方法的實(shí)現(xiàn),但是需要在原來聲明的基礎(chǔ)上加"Person::"在返回值類型和函數(shù)名之間,以表示是Person這個(gè)類作用域下的display方法;main函數(shù)只可以調(diào)用display方法和修改m_Name屬性,因?yàn)橹挥羞@兩個(gè)在punlic:權(quán)限下了。
class和struct的區(qū)別
在C++中 struct和class唯一的區(qū)別就在于默認(rèn)的訪問權(quán)限不同
class 默認(rèn)權(quán)限是私有
struct 默認(rèn)權(quán)限是公共
示例:
class C1 { int m_A; //默認(rèn)是私有權(quán)限 }; struct C2 { int m_A; //默認(rèn)是公共權(quán)限 }; int main() { C1 c1; c1.m_A = 10; //錯(cuò)誤,訪問權(quán)限是私有 C2 c2; c2.m_A = 10; //正確,訪問權(quán)限是公共 system("pause"); return 0; }
class和struct中都定義了m_A屬性,但是main函數(shù)中是無法修改類c1對(duì)象的m_A屬性的
成員屬性私有
優(yōu)點(diǎn)1:將所有成員屬性設(shè)置為私有,可以自己控制讀寫權(quán)限
優(yōu)點(diǎn)2:對(duì)于寫權(quán)限,我們可以檢測(cè)數(shù)據(jù)的有效性
示例:
class Person { public: //姓名設(shè)置可讀可寫 void setName(string name) { m_Name = name; } string getName() { return m_Name; } //獲取年齡 int getAge() { return m_Age; } //設(shè)置年齡 void setAge(int age) { if (age < 0 || age > 150) { cout << "你個(gè)大烏龜!" << endl; return; } m_Age = age; } //情侶設(shè)置為只寫 void setLover(string lover) { m_Lover = lover; } private: string m_Name; //可讀可寫 姓名 int m_Age; //只讀 年齡 string m_Lover; //只寫 愛人 }; int main() { Person p; //姓名設(shè)置 p.setName("張三"); cout << "姓名: " << p.getName() << endl; //年齡設(shè)置 p.setAge(50); cout << "年齡: " << p.getAge() << endl; //愛人設(shè)置 p.setLover("阿尼亞"); //cout << "愛人: " << p.m_Lover << endl; //只寫屬性,不可以讀取 system("pause"); return 0; }
當(dāng)屬性都設(shè)計(jì)成私有時(shí),我們可以自己控制屬性的讀寫權(quán)限,讓程序更具有強(qiáng)壯性,通過寫方法來讀寫屬性,是不是很具有掌控性呢,接下來給出一個(gè)案例,加深理解。
案例練習(xí)
利用全局函數(shù)和成員方法兩種方式判斷兩個(gè)立方體是否相等,要求利用類的知識(shí),將屬性設(shè)置為私有。
參考代碼:
#include<iostream> using namespace std; //案例1 判斷兩個(gè)立方體是否相等 class Cube { public: void setL(int l) { m_L = l; } int getL() { return m_L; } void setW(int w) { m_W = w; } int getW() { return m_W; } void setH(int h) { m_H = h; } int getH() { return m_H; } int Area(int a, int b, int c) { return 2 * (a * b + a * c + b * c); } int 體積(int a, int b, int c) { return a * b * c; } bool isSameByClass(Cube& x) { if (x.getH() == m_H && x.getL() == m_L && x.getW() == m_W) { return true; } else { return false; } } private: int m_L; int m_W; int m_H; }; //利用全局函數(shù)判斷,兩個(gè)立方體是否相等 bool isSame(Cube& c1, Cube& c2) { if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH()) { return true; } else { return false; } } int main() { Cube c1; c1.setH(10); c1.setL(10); c1.setW(10); Cube c2; c2.setH(10); c2.setL(10); c2.setW(10); cout << "面積為:" << c1.Area(c1.getH(), c1.getH(), c1.getL()) << endl; cout << "體積為:" << c1.體積(c1.getH(), c1.getH(), c1.getL()) << endl; //利用成員函數(shù)判斷立方體 if (c1.isSameByClass(c2)) { cout << "兩個(gè)立方體相等" << endl; } else { cout << "兩個(gè)立方體不相等" << endl; } //利用全局函數(shù)判斷 bool ret = isSame(c1, c2); if (ret) { cout << "兩個(gè)立方體相等" << endl; } else { cout << "兩個(gè)立方體不相等" << endl; } }
這是案例的源代碼,是個(gè)非?;A(chǔ),能練習(xí)本篇博文內(nèi)容的案例,希望大家可以理解其中的代碼含義
到此這篇關(guān)于C++深入探索類和對(duì)象之封裝及class與struct的區(qū)別的文章就介紹到這了,更多相關(guān)C++封裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++中的struct和class的區(qū)別詳解
- C++詳細(xì)講解函數(shù)調(diào)用與Struct和CLass的區(qū)別
- C++深入探索類真正的形態(tài)之struct與class
- C++基礎(chǔ) class、struct、union詳細(xì)
- C++ class和struct到底有什么區(qū)別詳解
- C++結(jié)構(gòu)體struct和類class區(qū)別詳解
- C++中聲明類的class與聲明結(jié)構(gòu)體的struct關(guān)鍵字詳解
- C++中關(guān)鍵字Struct和Class的區(qū)別
- 深入C++中struct與class的區(qū)別分析
- c++中struct和class的區(qū)別小結(jié)
相關(guān)文章
C++ txt 文件讀取,并寫入結(jié)構(gòu)體中的操作
這篇文章主要介紹了C++ txt 文件讀取,并寫入結(jié)構(gòu)體中的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12解析Linux內(nèi)核的基本的模塊管理與時(shí)間管理操作
這篇文章主要介紹了Linux內(nèi)核的基本的模塊管理與時(shí)間管理操作,包括模塊加載卸載函數(shù)的使用和定時(shí)器的用法等知識(shí),需要的朋友可以參考下2016-02-02- 形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用, 離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用,形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí), 主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送2021-11-11
C++ OpenCV實(shí)現(xiàn)抖音"藍(lán)線挑戰(zhàn)"特效
這篇文章主要介紹了如何使用OpenCV C++ 實(shí)現(xiàn)抖音上的特效“藍(lán)線挑戰(zhàn)”。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,需要的可以參考一下2022-01-01