C++面向對象有三大特性:封裝、繼承和多態。
封裝
- 將屬性和行為作為一個整體。
- 將屬性和行為加以權限控制。
例子1:設計一個圓類
#include <iostream>
using namespace std;// 設計一個圓類,求圓的周長
// 圓周率:3.14
const double PI = 3.14;class Circle {
public:// 屬性int m_r; // 半徑// 行為// 獲取圓的周長double calculateZC() {return 2*PI*m_r;}
};int main() {// 通過圓類創建一個具體的圓(對象)// c就是一個具體的圓(對象) // 通過一個類創建一個圓對象的過程叫做實例化Circle c; //創建對象 局部變量 放在棧上c.m_r = 10; // 給圓對象的半徑賦值cout << c.calculateZC() << endl;return 0;
}
例子二 可以通過類的行為 對屬性賦值。
#include <iostream>
using namespace std;class Student {
public:// 屬性string s_name;int m_id;// 行為// 給姓名和學號進行賦值操作 可以通過類的行為 對屬性賦值。void setName(string name) {s_name = name;}void setId(int id) {m_id = id;}// 顯示姓名和學號void showInfo() {cout << s_name << " " << m_id << endl;}};int main() {Student s1{"張三", 001};s1.showInfo();Student s2;s2.setName("homo");s2.setId(111);s2.showInfo();
}
封裝的訪問權限
- public: 公有屬性,類外可以訪問
- private: 私有屬性,類外不可以訪問
- protected: 保護屬性,類外不可以訪問,類內可以訪問,子類可以訪問
#include <iostream>
using namespace std;class Person {// 姓名 公共權限public:string m_name;// 汽車 保護權限protected:string m_car;// 銀行密碼 私有權限private:int m_password;// 行為public:void func() {m_name = "張三";m_car = "保時捷";m_password = 123456;}void showInfo() {cout << "姓名:" << m_name << endl;cout << "汽車:" << m_car << endl;cout << "密碼:" << m_password << endl;}
};int main() {Person p1;p1.m_name = "homo";cout << p1.m_name << endl;// p1.m_car = "拖拉機"; 報錯,保護權限類外無法訪問// cout << p1.m_car << endl;// p1.m_password = 987654; 報錯,私有權限類外無法訪問// cout << p1.m_password << endl;Person p2;p2.func();cout << p2.m_name << endl;// cout << p2.m_car << endl; 同樣報錯,只能通過公開函數訪問// cout << p2.m_password << endl; 同樣報錯,只能通過公開函數訪問p2.showInfo(); // 正確,通過公開函數訪問
}
Struct和Class的區別
Struct默認為公有
Class默認為私有
成員屬性設置為私有
將所有成員屬性私有化,無論是想讓他可讀可寫還是只讀狀態。
可讀可寫的成員屬性可以在類內實現一個賦值的函數。該賦值函數放在公有權限中,實現類內訪問修改值。只讀的可以直接寫個返回函數,實現讀取。
set() get()
#include <iostream>
#include <string>using namespace std;class Person {// 公有方法對私有屬性進行控制
public:// 姓名:可讀可寫// 姓名的寫操作:設置姓名void setName(string name) {m_Name = name;}// 姓名的讀操作:獲取姓名string getName() {return m_Name;}// 年齡設置可讀可寫// 獲取年齡int getAge() {return m_Age;}// 年齡設置可讀可寫void setAge(int age) {if (age >= 0 && age <= 150)m_Age = age;else {cout << "年齡需要在0-150之間" << endl;return; // 年齡輸入有誤,返回}}// 情人設置可寫void setLover(string lover) {m_lover = lover;}
private:string m_Name; // 姓名 可讀可寫int m_Age = 18; // 年齡 可讀可寫,但只能在0-150之間string m_lover; // 情人 只寫};int main() {Person p;// 寫姓名p.setName("aj");// 讀姓名cout << "姓名:" << p.getName() << endl;// 寫年齡p.setAge(20);// 讀年齡cout << "年齡:" << p.getAge() << endl;return 0;
}
立方體案例
//
// 設計立方體類(Cube),求出立方體的面積和體積。
// 分別用全局函數和成員函數判斷兩個立方體是否相等。
//
#include <iostream>
using namespace std;class Cube
{// 屬性
private:double m_L; //長double m_W; //寬double m_H; //高// 行為
public:// 屬性為私有,設置方法獲取長寬高// 設置長void setL(double L) {m_L = L;}// 獲取長double getL() {return m_L;}// 設置寬void setW(double W) {m_W = W;}// 獲取寬double getW() {return m_W;}// 設置高void setH(double H) {m_H = H;}// 獲取高double getH() {return m_H;}// 求立方體的面積double getArea() {return 2*(m_L*m_W+m_L*m_H+m_W*m_H);}// 求立方體的體積double Volume() {return m_L*m_W*m_H;}// 成員函數判斷兩個立方體是否相等bool isEqualByClass(Cube & c) {if (m_L == c.getL() && m_W == c.getW() && m_H == c.getH())return true;elsereturn false;}
};// 全局函數:判斷兩個立方體是否相等
// 思路:分別比較兩個立方體的長寬高是否相等,如果相等則認為兩個立方體相等
bool isEqual(Cube & c1, Cube & c2) {if (c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH())return true;elsereturn false;
}int main()
{// 實例化兩個立方體Cube c1;c1.setL(10);c1.setW(20);c1.setH(30);cout << "c1的面積為:" << c1.getArea() << endl;cout << "c1的體積為:" << c1.Volume() << endl;cout << "--------------------" << endl;Cube c2;c2.setL(10);c2.setW(20);c2.setH(30);cout << "c2的面積為:" << c2.getArea() << endl;cout << "c2的體積為:" << c2.Volume() << endl;cout << "--------------------" << endl;// 全局函數判斷兩個立方體是否相等bool a = isEqual(c1, c2);if (a)cout << "兩個立方體相等" << endl;elsecout << "兩個立方體不相等" << endl;cout << endl;// 成員函數判斷兩個立方體是否相等bool b = c1.isEqualByClass(c2);if (b)cout << "成員函數判斷:兩個立方體相等" << endl;elsecout << "成員函數判斷:兩個立方體不相等" << endl;
}