?C++面向對象的三大特性:封裝、繼承、多態
具有相同性質的對象,抽象為類
4.1 封裝
封裝的意義:將屬性和行為作為一個整體,表現生活中的事物,并將屬性和行為加以權限控制。
4.1.1 類的定義及實例化對象
語法:class 類名{訪問權限:屬性/行為};
類中的屬性和行為統稱為成員,屬性也可以稱為成員屬性或成員變量,行為也可以稱為成員函數或成員方法。
代碼如下:
#include <iostream>
using namespace std;//設計一個圓類,求圓的周長
const double PI=3.14;//class代表設計一個類,類后面緊跟的是類名稱
class Circle
{//訪問權限
public://公共權限//屬性//半徑int r;//行為:獲取圓的周長double calculateZC(){return 2*PI*r;}};int main()
{//實例化:通過圓類,創建具體的圓(對象)Circle c1;//給圓對象的屬性進行賦值c1.r=10;cout<<"圓的周長為:"<<c1.calculateZC()<<endl;return 0;
}
輸出如下:
4.1.2 訪問權限
訪問權限分為三種:
- 公共權限:類內外都可以訪問成員
- 保護權限:類內可以訪問成員,類外不能訪問
- 私有權限:類內可以訪問成員,類外不能訪問
代碼如下:
#include <iostream>
using namespace std;class Person
{//公共權限
public:string name;//保護權限
protected:string car;//私有權限
private:int passwd;
public:void func(){name="ddd";car="bench";passwd=4444;}
};
int main()
{//實例化一個對象Person p1;//給圓對象的屬性進行賦值p1.name="dddd";//p1.car="paosij";//p1.passwd=1234;return 0;
}
錯誤示例:修改保護權限和私鑰權限的屬性。
成員屬性設置為私有,可以自己控制讀寫權限,對于寫權限,可以檢測數據的有效性。
代碼如下:
#include <iostream>
using namespace std;class Person
{
public://設置姓名void setName(string name){m_name=name;}//獲取姓名string getName(){return m_name;}//獲取年齡int getAge(){return m_age;}//設置偶像void setIdol(string idol){m_idol=idol;}private:string m_name;//姓名 可讀可寫int m_age=18;//年齡 只讀string m_idol;//偶像 只寫};
int main()
{//實例化一個對象Person p;//設置姓名p.setName("ddd");//獲取姓名cout<<"姓名:"<<p.getName()<<endl;//設置年齡,不存在該函數//p.setAge("ddd");//報錯 不存在該成員setAge//p.m_age=23;//報錯 無法訪問//獲取年齡cout<<"年齡:"<<p.getAge()<<endl;//設置偶像p.setIdol("huge");//獲取偶像,沒有獲取函數//cout<<"偶像:"<<p.getIdol()<<endl;//報錯 不存在該成員getIdol//cout<<"偶像:"<<p.m_idol()<<endl;//報錯 無法訪問return 0;
}
錯誤示例:
4.1.3 struct 與 class
- struct默認權限為公共
- class默認權限為私有
錯誤示例:訪問class中默認權限下的成員。
4.1.4 案例1:立方體類
題目:設計立方體類,求出立方體的面積和體積,分別用全局函數和成員函數判斷兩個立方體是否相等。
代碼如下:
#include <iostream>
using namespace std;class Cube
{
private://屬性:長寬高int l;int w;int h;public://設置\獲取屬性void setLong(int ll){l=ll;}int getLong(){return l;}void setWidth(int ww){w=ww;}int getWidth(){return w;}void setHeight(int hh){h=hh;}int getHeight(){return h;}//方法:計算面積、體積、判斷兩個立方體是否相等int getSquare(){return 2*(l*h+h*w+h*w);}int getVolume(){return l*w*h;}//利用成員函數判斷兩個立方體是否相等void isEqual(Cube &c){if(l==c.getLong() && w==c.getWidth() && h==c.getHeight()){cout<<"兩個立方體相同"<<endl;}else{cout<<"兩個立方體不同"<<endl;}}
};//利用全局函數判斷兩個立方體是否相等
void isSame(Cube &c1,Cube &c2)
{if(c1.getLong()==c2.getLong() && c1.getWidth()==c2.getWidth() && c1.getHeight()==c2.getHeight()){cout<<"兩個立方體相同"<<endl;}else{cout<<"兩個立方體不同"<<endl;}
}int main()
{//創建對象Cube c1;c1.setLong(1);c1.setWidth(2);c1.setHeight(3);cout<<"c1的面積為:"<<c1.getSquare()<<endl;cout<<"c1的體積為:"<<c1.getVolume()<<endl;Cube c2;c2.setLong(1);c2.setWidth(2);c2.setHeight(3);//判斷兩個立方體是否相等isSame(c1,c2);c1.isEqual(c2);c2.setLong(2);isSame(c1,c2);c1.isEqual(c2);return 0;
}
輸出如下:
4.1.5 案例2:點和圓(分文件)
題目:設計一個圓形類和一個點類,計算點和圓的關系。
代碼如下:
#include <iostream>
using namespace std;//點類
class Point
{
private:int p_x;int p_y;public://設置/獲取X,Yvoid setX(int x){p_x=x;}int getX(){return p_x;}void setY(int y){p_y=y;}int getY(){return p_y;}
};//圓類
class Circle
{
private: int c_r;//半徑Point center;//圓心public://設置/獲取半徑圓心void setR(int r){c_r=r;}int getR(){return c_r;}void setCer(Point cer){center=cer;}Point getCer(){return center;}
};//判斷點和圓的關系
void isInCircle(Circle &c,Point &p)
{int dist=(c.getCer().getX()-p.getX()) * (c.getCer().getX()-p.getX())+(c.getCer().getY()-p.getY()) * (c.getCer().getY()-p.getY());int rdist=c.getR() * c.getR();if(dist==rdist){cout<<"點在圓上"<<endl;}else if(dist>rdist){cout<<"點在圓外"<<endl;}else{cout<<"點在圓內"<<endl;}
}int main()
{//創建點對象和圓對象Point p;Circle c;Point center;//設置點的坐標p.setX(0);p.setY(0);//設置園的半徑及圓心的坐標c.setR(10);center.setX(10);center.setY(0);c.setCer(center);//判斷點與圓的關系isInCircle(c,p);return 0;
}
輸出如下:
分文件編寫:
point.h
#pragma once//防止頭文件重復包含
#include <iostream>
using namespace std;//點類
class Point
{
private:int p_x;int p_y;public://設置/獲取X,Yvoid setX(int x);int getX();void setY(int y);int getY();};
point.cpp
#include "point.h"//點類//設置/獲取X,Y
void Point::setX(int x)//Point::的作用是聲明該函數是Point作用域下的成員函數
{p_x=x;
}
int Point::getX()
{return p_x;
}void Point::setY(int y)
{p_y=y;
}
int Point::getY()
{return p_y;
}
circle.h
#pragma once
#include <iostream>
using namespace std;
#include "point.h"//圓類
class Circle
{
private: int c_r;//半徑Point center;//圓心public://設置/獲取半徑圓心void setR(int r);int getR();void setCer(Point cer);Point getCer();};
circle.cpp
#include "circle.h"//圓類//設置/獲取半徑圓心
void Circle::setR(int r)
{c_r=r;
}
int Circle::getR()
{return c_r;
}void Circle::setCer(Point cer)
{center=cer;
}Point Circle::getCer()
{return center;
}
main.cpp
#include <iostream>
using namespace std;
#include "point.h"
#include "circle.h"//判斷點和圓的關系
void isInCircle(Circle &c,Point &p)
{int dist=(c.getCer().getX()-p.getX()) * (c.getCer().getX()-p.getX())+(c.getCer().getY()-p.getY()) * (c.getCer().getY()-p.getY());int rdist=c.getR() * c.getR();if(dist==rdist){cout<<"點在圓上"<<endl;}else if(dist>rdist){cout<<"點在圓外"<<endl;}else{cout<<"點在圓內"<<endl;}
}int main()
{//創建點對象和圓對象Point p;Circle c;Point center;//設置點的坐標p.setX(0);p.setY(0);//設置園的半徑及圓心的坐標c.setR(10);center.setX(10);center.setY(0);c.setCer(center);//判斷點與圓的關系isInCircle(c,p);return 0;
}