本文是筆者在C++學(xué)習(xí)過程中,對類和對象的總結(jié)記錄,如有不對以及不足的地方,歡迎大家指正!
文中代碼學(xué)于黑馬。
封裝(Encapsulation)
??C++ 是面向?qū)ο蟮恼Z言,其主要特征是封裝(Encapsulation)、繼承(Inheritance)和多態(tài)(Polymorphism)。
??C++認為,萬事萬物皆為對象,對象上有其屬性和行為。封裝,就是將具有相同性質(zhì)的對象抽象為類(class),并且對類的屬性(成員變量)和行為(成員函數(shù))加以權(quán)限,以進行控制。
??類(class) 定義的語法為:
class 類名{
訪問權(quán)限:
屬性/行為;
......
}
1. 封裝的意義
- 將屬性和行為作為整體,以此來表現(xiàn)事物
- 將屬性和行為加以權(quán)限控制
2. 訪問權(quán)限
-
公共權(quán)限 public
類內(nèi)可訪問,類外可訪問,子類可訪問 -
保護權(quán)限 protected
類內(nèi)可訪問,類外不可訪問,子類可訪問 -
私有權(quán)限 private
類內(nèi)可訪問,類外不可訪問,子類不可訪問
3.class與struct的區(qū)別
??class 與 struct 的唯一區(qū)別,就在于兩者的默認訪問權(quán)限不同。
??class 的默認訪問權(quán)限為 public
?? struct 的默認訪問權(quán)限為 private
4. 成員屬性私有化
??將成員屬性設(shè)置為私有(public),有以下兩點好處:
- 可以自己控制讀寫權(quán)限
- 對于寫權(quán)限,可以對寫入數(shù)據(jù)的有效性加以檢測
代碼示例
1. 設(shè)計實例1:立方體類設(shè)計與實現(xiàn)
#include <iostream>
using namespace std;
//設(shè)計實例1:立方體類設(shè)計與實現(xiàn)
class Cube{
public:
//獲取、設(shè)置長寬高(get、set方法)
int getLength() const {
return length;
}
void setLength(int length) {
this->length = length;
}
int getWidth() const {
return width;
}
void setWidth(int width) {
this->width = width;
}
int getHeight() const {
return height;
}
void setHeight(int height) {
this->height = height;
}
//獲取立方體面積
int getArea() const{
return 2*(length*width+length*height+width*height);
}
//獲取立方體體積
int getVolumn() const{
return length*width*height;
}
//成員函數(shù) 函數(shù) 判斷兩個立方體是否相等
bool isEqualCube(Cube cube) const{
return length==cube.getLength() &&
width==cube.getWidth() &&
height==cube.getHeight();
}
private: //成員屬性私有化
int length; //長度
int width; //寬度
int height; //高度
};
//全局函數(shù) 判斷兩個立方體是否相等
bool isEqualCube(Cube c1,Cube c2){
return c1.getLength()==c2.getLength() &&
c1.getWidth()==c2.getWidth() &&
c1.getHeight()==c2.getHeight();
}
int main() {
//設(shè)計實例1:立方體類設(shè)計與實現(xiàn)
cout<<"設(shè)計實例1:立方體類設(shè)計與實現(xiàn)"<<endl;
Cube cube1{};
cube1.setLength(10);
cube1.setHeight(10);
cube1.setWidth(10);
cout<<"cube1 的面積為:"<<cube1.getArea()<<endl;
cout<<"cube1 的體積為:"<<cube1.getVolumn()<<endl;
Cube cube2{};
cube2.setLength(10);
cube2.setHeight(10);
cube2.setWidth(10);
cout<<"cube2 的面積為:"<<cube2.getArea()<<endl;
cout<<"cube2 的體積為:"<<cube2.getVolumn()<<endl;
cout<<"全局函數(shù)"<<endl;
cout<<"cube1 與 cube2 是"<< ( isEqualCube(cube1,cube2) ? "相等的" : "不相等的" )<<endl ;
cout<<"成員函數(shù)"<<endl;
cout<<"cube1 與 cube2 是"<< ( cube1.isEqualCube(cube2) ? "相等的" : "不相等的" )<<endl ;
return 0;
}
2. 設(shè)計實例2:圓類與點類關(guān)系的設(shè)計與實現(xiàn)
#include <iostream>
using namespace std;
//設(shè)計實例2:圓類與點類關(guān)系的設(shè)計與實現(xiàn)
//點類(Point)
class Point{
public:
//獲取、設(shè)置X、Y坐標
int getX() const {
return X;
}
void setX(int x) {
X = x;
}
int getY() const {
return Y;
}
void setY(int y) {
Y = y;
}
private:
int X; //X坐標
int Y; //Y坐標
};
//園類(Circle)
class Circle{
public:
int getRadius() const {
return radius;
}
void setRadius(int radius) {
Circle::radius = radius;
}
const Point &getPoint() const {
return center;
}
void setPoint(const Point &point) {
Circle::center = point;
}
private:
int radius; //半徑
Point center; //圓心
};
//判斷點和圓的關(guān)系(點在圓外、點在圓上、點在圓內(nèi))
void isInCircle(Circle &c,Point &p){
//計算兩點間距離的平方
int distance = (c.getPoint().getX()-p.getX())*(c.getPoint().getX()-p.getX()) +
(c.getPoint().getY()-p.getY())*(c.getPoint().getY()-p.getY());
//計算半徑的平方
int rr = c.getRadius()*c.getRadius();
if (distance>rr) {
cout<<"點在圓外"<<endl;
} else if (distance==rr){
cout<<"點在圓上"<<endl;
} else {
cout<<"點在圓內(nèi)"<<endl;
}
}
int main() {
//設(shè)計實例2:圓類與點類關(guān)系的設(shè)計與實現(xiàn)
cout<<"設(shè)計實例2:圓類與點類關(guān)系的設(shè)計與實現(xiàn)"<<endl;
Circle circle{};
circle.setRadius(10);
Point center{};
center.setX(20);
center.setY(10);
circle.setPoint(center);
Point point{};
point.setX(20);
point.setY(10);
//判斷關(guān)系
isInCircle(circle,point);
return 0;
}