封裝
1 封裝的意義
封裝是C++面向對象三大特性之一
封裝的意義:
- 將屬性和行為作為一個整體,表現生活中的事物
- 將屬性和行為加以權限控制
封裝意義一:
在設計類的時候,屬性和行為寫在一起,表現事物
語法: class 類名{ 訪問權限: 屬性 / 行為 };
示例1:設計一個圓類,求圓的周長
示例代碼:
//圓周率
const double PI = 3.14;
//1、封裝的意義
//將屬性和行為作為一個整體,用來表現生活中的事物
//封裝一個圓類,求圓的周長
//class代表設計一個類,后面跟着的是類名
class Circle
{
public: //訪問權限 公共的權限
//屬性
int m_r;//半徑
//行為
//獲取到圓的周長
double calculateZC()
{
//2 * pi * r
//獲取圓的周長
return 2 * PI * m_r;
}
};
int main() {
//通過圓類,創建圓的對象
// c1就是一個具體的圓
Circle c1;
c1.m_r = 10; //給圓對象的半徑 進行賦值操作
//2 * pi * 10 = = 62.8
cout << "圓的周長為: " << c1.calculateZC() << endl;
system("pause");
return 0;
}
示例2:設計一個學生類,屬性有姓名和學號,可以給姓名和學號賦值,可以顯示學生的姓名和學號
示例2代碼:
//學生類
class Student {
public:
void setName(string name) {
m_name = name;
}
void setID(int id) {
m_id = id;
}
void showStudent() {
cout << "name:" << m_name << " ID:" << m_id << endl;
}
public:
string m_name;
int m_id;
};
int main() {
Student stu;
stu.setName("德瑪西亞");
stu.setID(250);
stu.showStudent();
system("pause");
return 0;
}
封裝意義二:
類在設計時,可以把屬性和行為放在不同的權限下,加以控制
訪問權限有三種:
- public 公共權限
- protected 保護權限
- private 私有權限
示例:
//三種權限
//公共權限 public 類內可以訪問 類外可以訪問
//保護權限 protected 類內可以訪問 類外不可以訪問
//私有權限 private 類內可以訪問 類外不可以訪問
class Person
{
//姓名 公共權限
public:
string m_Name;
//汽車 保護權限
protected:
string m_Car;
//銀行卡密碼 私有權限
private:
int m_Password;
public:
void func()
{
m_Name = "張三";
m_Car = "拖拉機";
m_Password = 123456;
}
};
int main() {
Person p;
p.m_Name = "李四";
//p.m_Car = "奔馳"; //保護權限類外訪問不到
//p.m_Password = 123; //私有權限類外訪問不到
system("pause");
return 0;
}
2 struct和class區別
在C++中 struct和class唯一的區別就在於 默認的訪問權限不同
區別:
- struct 默認權限為公共
- class 默認權限為私有
class C1
{
int m_A; //默認是私有權限
};
struct C2
{
int m_A; //默認是公共權限
};
int main() {
C1 c1;
c1.m_A = 10; //錯誤,訪問權限是私有
C2 c2;
c2.m_A = 10; //正確,訪問權限是公共
system("pause");
return 0;
}
3 成員屬性設置為私有
優點1:將所有成員屬性設置為私有,可以自己控制讀寫權限
優點2:對於寫權限,我們可以檢測數據的有效性
示例:
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) {
cout << "你個老妖精!" << endl;
return;
}
m_Age = age;
}
//情人設置為只寫
void setLover(string lover) {
m_Lover = lover;
}
private:
string m_Name; //可讀可寫 姓名
int m_Age; //只讀 年齡
string m_Lover; //只寫 情人
};
int main() {
Person p;
//姓名設置
p.setName("張三");
cout << "姓名: " << p.getName() << endl;
//年齡設置
p.setAge(50);
cout << "年齡: " << p.getAge() << endl;
//情人設置
p.setLover("蒼井");
//cout << "情人: " << p.m_Lover << endl; //只寫屬性,不可以讀取
system("pause");
return 0;
}
練習案例1:設計立方體類
設計立方體類(Cube)
求出立方體的面積和體積
分別用全局函數和成員函數判斷兩個立方體是否相等。

#include <iostream>
using namespace std;
//封裝案例-立方體
//設計立方體類(Cube)
//
//求出立方體的面積和體積
//
//分別用全局函數和成員函數判斷兩個立方體是否相等。
class Cube
{
//屬性
private:
int m_Length;//長
int m_Width;//寬
int m_Height;//高
//方法
public:
//設置和獲取長
void setLength(int Length)
{
m_Length = Length;
}
int getLength()
{
return m_Length;
}
//設置和獲取寬
void setWidth(int Width)
{
m_Width = Width;
}
int getWidth()
{
return m_Width;
}
//設置和獲取高
void setHeight(int Height)
{
m_Height = Height;
}
int getHeight()
{
return m_Height;
}
//求立方體面積
int Cube_Area()
{
return (m_Length*m_Width + m_Length*m_Height + m_Width*m_Height) * 2;
}
//求立方體體積
int Cube_Volume()
{
return m_Length*m_Width*m_Height;
}
//利用成員函數來判斷兩個立方體是否相等
bool isSameByClass(Cube &c)
{
if (m_Length == c.getLength()&&m_Width == c.getWidth()&&m_Height == c.getHeight())
{
return true;
}
return false;
}
};
//利用全局函數來判斷兩個立方體是否相等
bool isSame(Cube &c1, Cube &c2)
{
if (c1.getLength() == c2.getLength()&&c1.getWidth() == c2.getWidth()&&c1.getHeight() == c2.getHeight())
{
return true;
}
return false;
}
int main() {
Cube c1;
c1.setLength(10);
c1.setWidth(20);
c1.setHeight(30);
cout << "c1的面積為: " << c1.Cube_Area() << endl;
cout << "c1的體積為: " << c1.Cube_Volume() << endl;
Cube c2;
c2.setLength(10);
c2.setWidth(20);
c2.setHeight(30);
//使用全局函數來判斷
bool ref = isSame(c1, c2);
if (ref)
{
cout << "全局函數判斷:c1和c2是相等的" << endl;
}
else
cout << "全局函數判斷:c1和c2是不相等的" << endl;
//使用成員函數來判斷
bool ret = c1.isSameByClass(c2);
if (ret)
{
cout << "成員函數判斷:c1和c2是相等的" << endl;
}
else
cout << "成員函數判斷:c1和c2是不相等的" << endl;
system("pause");
return 0;
}
練習案例2:點和圓的關系
設計一個圓形類(Circle),和一個點類(Point),計算點和圓的關系。

主要學習類的分文件編寫方法,先看文件結構目錄:

各文件中的內容:
circle.h文件
#pragma once//防止頭文件重復包含
#include <iostream>
using namespace std;
#include "point.h"
//圓類
class Circle
{
private:
int m_R;//半徑
Point m_Center;//圓心
public:
void setR(int R);//設置半徑
int getR();//獲取半徑
void setCenter(Point Center);//設置圓心
Point getCenter();//獲取圓心
};
point.h文件
#pragma once//防止頭文件重復包含
#include <iostream>
using namespace std;
//點類
class Point
{
private:
int m_X;//點的x軸坐標
int m_Y;//點的y軸坐標
public:
void setX(int X);//設置X
int getX();//返回X
void setY(int Y);//設置Y
int getY();//返回Y
};
.cpp文件
#include <iostream>
using namespace std;
#include "circle.h"
#include "point.h"
//點和圓的關系
////點類
//class Point
//{
//private:
// int m_X;//點的x軸坐標
// int m_Y;//點的y軸坐標
//public:
// void setX(int X)//設置X
// {
// m_X = X;
// }
// int getX()//返回X
// {
// return m_X;
// }
// void setY(int Y)//設置Y
// {
// m_Y = Y;
// }
// int getY()//返回Y
// {
// return m_Y;
// }
//};
////圓類
//class Circle
//{
//private:
// int m_R;//半徑
// Point m_Center;//圓心
//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;
// }
//};
//判斷點在何處
void isInCircle(Point &p, Circle &c)
{
//計算兩點之間距離的平方
int distance =
(c.getCenter().getX() - p.getX())*(c.getCenter().getX() - p.getX()) +
(c.getCenter().getY() - p.getY())*(c.getCenter().getY() - p.getY());
//計算半徑的平方
int R = c.getR()*c.getR();
if (distance == R)
{
cout << "點在圓上" << endl;
}
else if (distance > R)
{
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(p, c);
system("pause");
return 0;
}
circle.cpp文件
#include "circle.h"
void Circle::setR(int R)//設置半徑
{
m_R = R;
}
int Circle::getR()//獲取半徑
{
return m_R;
}
void Circle::setCenter(Point Center)//設置圓心
{
m_Center = Center;
}
Point Circle::getCenter()//獲取圓心
{
return m_Center;
}
point.cpp文件
#include "point.h"
void Point::setX(int X)//設置X
{
m_X = X;
}
int Point::getX()//返回X
{
return m_X;
}
void Point::setY(int Y)//設置Y
{
m_Y = Y;
}
int Point::getY()//返回Y
{
return m_Y;
}
