C++之封裝


封裝

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;
}

封裝意義二:

類在設計時,可以把屬性和行為放在不同的權限下,加以控制

訪問權限有三種:

  1. public 公共權限
  2. protected 保護權限
  3. 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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM