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