【学习笔记】C++ 核心编程(二)类和对象——封装
內(nèi)容來(lái)自小破站《黑馬程序員C++》復(fù)習(xí)自用
【學(xué)習(xí)筆記】C++ 核心編程(二)類(lèi)和對(duì)象——封裝
- 4 類(lèi)和對(duì)象
- 4.1 封裝
- 4.1.1 封裝的意義(一)
- 4.1.1 封裝的意義(二)
- 4.1.2 struct和class的區(qū)別
- 4.1.3 成員屬性設(shè)置為私有
- 4.1.4 封裝案例一: 設(shè)計(jì)立方體類(lèi)
- 4.1.5 封裝案例二:點(diǎn)和圓的關(guān)系
- 4.1.6 如何將點(diǎn)類(lèi)圓類(lèi)放到別的文件里,通過(guò)寫(xiě)聲明,寫(xiě)實(shí)現(xiàn)
- 4.2 對(duì)象的初始化和清理(見(jiàn)后續(xù)更新...)
- 4.2.1 構(gòu)造函數(shù)和析構(gòu)函數(shù)(見(jiàn)后續(xù)更新...)
4 類(lèi)和對(duì)象
C++面向?qū)ο蟮娜筇匦?#xff1a;封裝、繼承、多態(tài)
C++認(rèn)為,萬(wàn)事萬(wàn)物皆為對(duì)象,對(duì)象上有其屬性和行為
例如:
人可以作為對(duì)象,屬性有姓名、年齡、身高、體重,行為有走、跑、唱歌、干飯;
車(chē)可以作為對(duì)象,屬性有輪胎、車(chē)燈、方向盤(pán),行為有載人、放音樂(lè)、飄逸;
具有相同性質(zhì)的對(duì)象,我們可以抽象的成為類(lèi),人屬于人類(lèi),車(chē)屬于車(chē)類(lèi)。
4.1 封裝
封裝是C++面向?qū)ο蟮娜筇匦灾弧?/p>
4.1.1 封裝的意義(一)
需求:設(shè)計(jì)一個(gè)圓類(lèi),求圓的周長(zhǎng)
#include <iostream> using namespace std; //圓周率 const double PI = 3.14; //設(shè)計(jì)一個(gè)圓類(lèi),求圓的周長(zhǎng) //求圓的周長(zhǎng): 2*PI*半徑 //class代表要設(shè)計(jì)一個(gè)類(lèi),類(lèi)后邊緊跟著的就是類(lèi)名稱(chēng) class Circle {//訪問(wèn)權(quán)限//公共權(quán)限 public://屬性:半徑int m_r;//行為:獲取圓的周長(zhǎng)double calculateZC(){return 2 * PI * m_r;} }; int main() {//通過(guò)圓類(lèi),來(lái)創(chuàng)建具體的圓(對(duì)象)//實(shí)例化:通過(guò)一個(gè)類(lèi),創(chuàng)建一個(gè)對(duì)象的過(guò)程Circle c1;//Circle是類(lèi),c1是具體對(duì)象名字 //給圓對(duì)象的屬性進(jìn)行賦值c1.m_r = 10;cout << "圓的周長(zhǎng)為:" << c1.calculateZC() << endl;system("pause");return 0; }練習(xí)案例
需求:設(shè)計(jì)一個(gè)學(xué)生類(lèi),屬性有姓名和學(xué)號(hào),可以給姓名和學(xué)號(hào)賦值,可以顯示學(xué)生的姓名和學(xué)號(hào)。
除了這種賦值方式,還有一種,可以通過(guò)函數(shù)的行為來(lái)給姓名賦值。
#include <iostream> using namespace std; #include <string> //學(xué)生類(lèi) class student { public: //公共權(quán)限//屬性string m_name;//姓名int m_id;//學(xué)號(hào)//給姓名賦值void setName(string name) {m_name = name;}void setID(int id) {m_id = id;}//行為:顯示姓名學(xué)號(hào)void showStudent() {cout << "姓名:" << m_name << endl;cout << "學(xué)號(hào):" << m_id << endl;} }; int main() {//創(chuàng)建一個(gè)具體的學(xué)生(實(shí)例化對(duì)象)student s1;s1.setName("Siri");s1.setID(2025302040);//顯示學(xué)生信息s1.showStudent();system("pause");return 0; }
》》》專(zhuān)業(yè)術(shù)語(yǔ)擴(kuò)展:》》》
4.1.1 封裝的意義(二)
類(lèi)在設(shè)計(jì)的時(shí)候,可以把屬性和行為放在不同的權(quán)限下,加以控制,但是什么時(shí)候用什么權(quán)限
訪問(wèn)權(quán)限有三種:
4.1.2 struct和class的區(qū)別
在C++中struct和class唯一的區(qū)別就在于【默認(rèn)的訪問(wèn)權(quán)限不同】
4.1.3 成員屬性設(shè)置為私有
優(yōu)點(diǎn)1:將成員屬性設(shè)置為私有,可以自己控制讀寫(xiě)權(quán)限
優(yōu)點(diǎn)2:對(duì)于讀寫(xiě)權(quán)限,我們可以檢測(cè)數(shù)據(jù)的有效性
年齡可讀可寫(xiě):
#include <iostream> using namespace std; //成員屬性設(shè)置為私有//設(shè)計(jì)人類(lèi) class Person { public://獲取年齡(可讀可寫(xiě)0-150歲)int getAge(){return m_Age;}//設(shè)置年齡,提供一個(gè)對(duì)外接口void setAge(int age){if (age < 0 || age >150){m_Age = 0;cout << "你這個(gè)老妖精" << endl;return;}m_Age = age;}private:int m_Age; }; int main() {Person p;p.setAge(1000);cout << "年齡" << p.getAge() << endl;system("pause");return 0; }4.1.4 封裝案例一: 設(shè)計(jì)立方體類(lèi)
創(chuàng)建第一個(gè)立方體:
#include <iostream> using namespace std; //立方體類(lèi)設(shè)計(jì) // 1. 創(chuàng)建立方體類(lèi) // 2. 設(shè)計(jì)屬性 // 3. 設(shè)計(jì)行為 獲取立方體的面和和體積 class Cube { public://設(shè)置長(zhǎng)寬高void setL(int l) {m_L = l;}void setW(int w) {m_W = w;}void setH(int h) {m_H = h;}//獲取長(zhǎng)寬高int getL() {return m_L;}int getW() {return m_W;}int getH() {return m_H;}//獲取立方體的表面積和體積int calculateS(){return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_H * m_W;}int calculateV(){return m_L * m_W * m_H;}private:int m_L;int m_W;int m_H;//長(zhǎng)寬高 };int main() {//實(shí)例化一個(gè)立方體C1的對(duì)象Cube c1;c1.setL(10);c1.setW(10);c1.setH(10);cout << "calculateS = " << c1.calculateS() << endl << endl;cout << "calculateV = " << c1.calculateV() << endl << endl;system("pause");return 0; }利用全局函數(shù)判斷:
#include <iostream> using namespace std;//立方體類(lèi)設(shè)計(jì) // 1. 創(chuàng)建立方體類(lèi) // 2. 設(shè)計(jì)屬性 // 3. 設(shè)計(jì)行為 獲取立方體的面和和體積 // 4. 分別利用全局函數(shù)和成員函數(shù),判斷兩個(gè)立方體是否相等 class Cube { public://設(shè)置長(zhǎng)寬高void setL(int l) {m_L = l;}void setW(int w) {m_W = w;}void setH(int h) {m_H = h;}//獲取長(zhǎng)寬高int getL() {return m_L;}int getW() {return m_W;}int getH() {return m_H;}//獲取立方體的表面積和體積int calculateS(){return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_H * m_W;}int calculateV(){return m_L * m_W * m_H;}private:int m_L;int m_W;int m_H;//長(zhǎng)寬高 };//利用全局函數(shù)判斷兩個(gè)立方體是否相等 bool isSame(Cube &c1, Cube &c2) //沒(méi)有&屬于值傳遞,值傳遞的時(shí)候會(huì)拷貝出來(lái)一份數(shù)據(jù)//為了方便,采用引用的方式,直接使用原始的數(shù)據(jù) {if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH()){return true;}return false; } int main() {//實(shí)例化一個(gè)立方體C1的對(duì)象Cube c1;c1.setL(10);c1.setW(10);c1.setH(10);cout << "calculateS = " << c1.calculateS() << endl << endl;cout << "calculateV = " << c1.calculateV() << endl << endl;//創(chuàng)建第二個(gè)立方體Cube c2;c2.setL(10);c2.setW(10);c2.setH(10);bool ret = isSame(c1, c2);if (ret){cout << "c1 = c2" << endl;}else{cout << "c1 != c2" << endl << endl;}system("pause");return 0; }我們管class類(lèi)里邊的東西叫做成員,下面利用成員函數(shù)判斷:
#include <iostream> using namespace std;//立方體類(lèi)設(shè)計(jì) // 1. 創(chuàng)建立方體類(lèi) // 2. 設(shè)計(jì)屬性 // 3. 設(shè)計(jì)行為 獲取立方體的面和和體積 // 4. 分別利用全局函數(shù)和成員函數(shù),判斷兩個(gè)立方體是否相等 class Cube { public://設(shè)置長(zhǎng)寬高void setL(int l) {m_L = l;}void setW(int w) {m_W = w;}void setH(int h) {m_H = h;}//獲取長(zhǎng)寬高int getL() {return m_L;}int getW() {return m_W;}int getH() {return m_H;}//獲取立方體的表面積和體積int calculateS(){return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_H * m_W;}int calculateV(){return m_L * m_W * m_H;}//利用成員函數(shù)判斷兩個(gè)立方體bool isSameByClass(Cube& c)//只需要傳一個(gè)立方體,然后拿另一個(gè)立方體來(lái)比較{if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH()){return true;}return false;}private:int m_L;int m_W;int m_H;//長(zhǎng)寬高 };//利用全局函數(shù)判斷兩個(gè)立方體是否相等 bool isSame(Cube &c1, Cube &c2) //沒(méi)有&屬于值傳遞,值傳遞的時(shí)候會(huì)拷貝出來(lái)一份數(shù)據(jù)//為了方便,采用引用的方式,直接使用原始的數(shù)據(jù) {if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH()){return true;}return false; } int main() {//實(shí)例化一個(gè)立方體C1的對(duì)象Cube c1;c1.setL(10);c1.setW(10);c1.setH(10);cout << "calculateS = " << c1.calculateS() << endl << endl;cout << "calculateV = " << c1.calculateV() << endl << endl;//創(chuàng)建第二個(gè)立方體Cube c2;c2.setL(10);c2.setW(10);c2.setH(11);//利用全局函數(shù)判斷bool ret = isSame(c1, c2);if (ret){cout << "全局函數(shù)判斷結(jié)果:c1 = c2" << endl;}else{cout << "全局函數(shù)判斷結(jié)果:c1 != c2" << endl << endl;}//利用成員函數(shù)判斷ret = c1.isSameByClass(c2);if (ret){cout << "成員函數(shù)判斷結(jié)果:c1 = c2" << endl;}else{cout << "成員函數(shù)判斷結(jié)果:c1 != c2" << endl << endl;}system("pause");return 0; }如果是全局函數(shù),要傳兩個(gè)立方體進(jìn)行對(duì)比,而成員函數(shù)只需要傳一個(gè)就好了。
4.1.5 封裝案例二:點(diǎn)和圓的關(guān)系
描述:設(shè)計(jì)一個(gè)圓形類(lèi)(Circle)和一個(gè)點(diǎn)類(lèi)(Point),計(jì)算點(diǎn)和圓的關(guān)系。
點(diǎn)和圓的關(guān)系判斷:
4.1.6 如何將點(diǎn)類(lèi)圓類(lèi)放到別的文件里,通過(guò)寫(xiě)聲明,寫(xiě)實(shí)現(xiàn)
大量注釋
Crtl + K + C首先我們創(chuàng)建兩個(gè)新文件,一個(gè).h頭文件,一個(gè).cpp源文件
先在.h頭文件中先寫(xiě)以下內(nèi)容
然后把點(diǎn)類(lèi)內(nèi)容粘貼過(guò)來(lái)
一般,在一個(gè)類(lèi)設(shè)計(jì)的時(shí)候,我們只需要聲明就可以了,把實(shí)現(xiàn)的都刪掉
然后再聲明之后加一個(gè)分號(hào),以補(bǔ)全。即:
在.cpp源文件里邊:
#include"point01.h" //先包含以下剛剛創(chuàng)建的.h頭文件然后把整個(gè)類(lèi)代碼再粘貼過(guò)來(lái)一次
刪掉class,刪掉private:
出現(xiàn)情況:
因?yàn)楝F(xiàn)在寫(xiě)在這里,是一個(gè)全局函數(shù),但是我們的setX應(yīng)該是成員函數(shù),加上Point::,代表這是Point作用域下的函數(shù)
寫(xiě)成:
整體縮進(jìn):
Shift + Tab即:
#include"point01.h" //先包含以下剛剛創(chuàng)建的.h頭文件 void Point::setX(int x) //設(shè)置 X 坐標(biāo) {m_X = x; } int Point::getX() //獲取 X 坐標(biāo) {return m_X; } void Point::setY(int y) {m_Y = y; } int Point::getY() {return m_Y; }這樣point拆分出來(lái)的份文件就寫(xiě)好了,在測(cè)試文件最上邊包含一下頭文件。
#include"point01.h"最后測(cè)試代碼:
#include <iostream> using namespace std; #include"point01.h" //圓類(lèi) class Circle { public:void setR(int r) //設(shè)置半徑{m_R = r;}int getR(){return m_R;}void setCenter(Point center) //設(shè)置圓心{m_Center = center;}Point getCenter(){return m_Center;}private: //核心,在類(lèi)中,可以讓另一個(gè)類(lèi),作為本類(lèi)的成員int m_R;Point m_Center; //上去自己創(chuàng)建一個(gè)數(shù)據(jù)類(lèi)型,里邊包含XY坐標(biāo) };//判斷點(diǎn)和圓的關(guān)系 void isInCircle(Circle& c, Point& p) {//先計(jì)算兩點(diǎn)之間距離的平方int distance =(c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +(c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());//計(jì)算半徑的平方int rDistance = c.getR() * c.getR();//判斷if (distance == rDistance){cout << "點(diǎn)在圓上" << endl;}else if (distance < rDistance){cout << "點(diǎn)在圓外" << endl;}else{cout << "點(diǎn)在圓內(nèi)" << endl;} }int main() {//創(chuàng)建一個(gè)圓Circle c;c.setR(10);Point center;center.setX(10);center.setY(0);c.setCenter(center);//創(chuàng)建一個(gè)點(diǎn)Point p;p.setX(10);p.setY(10);//判斷關(guān)系isInCircle(c, p);system("pause");return 0; }4.2 對(duì)象的初始化和清理(見(jiàn)后續(xù)更新…)
4.2.1 構(gòu)造函數(shù)和析構(gòu)函數(shù)(見(jiàn)后續(xù)更新…)
總結(jié)
以上是生活随笔為你收集整理的【学习笔记】C++ 核心编程(二)类和对象——封装的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【VirtualBox打开出错】创建CO
- 下一篇: c++手机编程软件_积木编程软件手机版下