C++類和對象之封裝詳解

封裝的意義以及示例

封裝是C++面向對象三大特征之一
封裝的意義:

將屬性和行為作為一個整體,表現生活中的事物將屬性和行為加以權限控制

語法:class 類名{  訪問權限 : 屬性  /  行為 };

在這裡插入圖片描述

類的對象的公共數據成員可以使用直接成員訪問運算符 . 來訪問。

示例1: 設計一個圓類,求圓的周長

#include<iostream>
using namespace std;
#define PI 3.14
class Circle
{
	//訪問權限
	//公共權限
public:
	//屬性
	int r;
	//行為
	double calculate()
	{
		return 2 * PI * r;
	}
};
int main()
{
	Circle a;
	a.r = 2;
	cout << a.calculate() << endl;
	system("pause");
	return 0;
}

示例2:設計一個學生類,屬性有姓名和學號,可以給姓名和學號賦值,可以顯示學生的姓名和學號

#include<iostream>
#include<string>
using namespace std;
class student
{
public:
	string name;
	int Id;
	void CinSudent()
	{
		cin >> name;
		cin >> Id;
	}
	void ShowStudent()
	{
		cout << name << endl;
		cout << Id << endl;
	}
};
int main()
{
	student a;
	a.CinSudent();
	a.ShowStudent();
	system("pause");
	return  0;
}

訪問權限

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

訪問權限有三種:
1.public  公共權限
2.protected  保護權限
3.private   私有權限

公共權限 public

成員類內可以訪問 類外不可以訪問

class Box
{
   public:
      double length;
      void setWidth( double wid );
      double getWidth( void );
};

保護權限 protected

成員類內可以訪問 類外不可以訪問 兒子可以訪問父親中的保護內容 protected(受保護)成員變量或函數與私有成員十分相似,但有一點不同, protected(受保護)成員在派生類(即子類)中是可訪問的。

class Box
{
   protected:
      double length;
      void setWidth( double wid );
      double getWidth( void );
};

下面的實例與前面的實例類似,在這裡 width 成員可被派生類 smallBox 的任何成員函數訪問。

私有權限 private

成員類內可以訪問 類外不可以訪問

兒子可以訪問父親中的私有內容

私有成員變量或函數在類的外部是不可訪問的,甚至是不可查看的。隻有類和友元函數可以訪問私有成員。

默認情況下,類的所有成員都是私有的。例如在下面的類中,width 是一個私有成員,

這意味著,如果您沒有使用任何訪問修飾符,類的成員將被假定為私有成員

class Box
{
   private:
      double length;
      void setWidth( double wid );
      double getWidth( void );
};

struct 和 class的區別

在C++中struct 和class的默認訪問權限不同
區別:
struct 默認訪問權限為公共
class 默認訪問權限為私有

#include<iostream>
using namespace std;
struct C1
{
	int m_A;//默認權限為公有
};
class C2
{
	int m_A;//默認權限為私有
};
int main()
{
	C1 c1;
	C2 c2;
	c1.m_A = 100;
	//c2.m_A = 100; 此處無法訪問
	return 0;
}

成員屬性私有化

優點1:將所有成員設置為私有,可以自己控制讀寫權限
優點2:對於寫權限,我們可以檢測數據的有效性
示例:

#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
	void Setname(string name1)
	{
		name = name1;
	}
	string Showname()
	{
		return name;
	}
	int Showage()
	{
		return age;
	}
private:   //私有權限
	string name;
	int age=18;
};
int main()
{
	Person a;
	a.Setname("張三");
	cout << "姓名為: " << a.Showname() << endl;
	cout << "年齡為: " << a.Showage() << endl;
	system("pause");
	return 0;
}

案例1:設計立方體類

要求:
設計立方體
求出立方體的面積和體積
分別用全局函數和成員函數判斷兩個立方體是否相等
代碼實現:

#include<iostream>
#include<string>
using namespace std;
class Cube
{
public:
	//設置長
	void setL(int l)
	{
		m_L = l;
	}
	//設置寬
	void setW(int w)
	{
		m_W = w;
	}
	//設置高
	void setH(int h)
	{
		m_H = h;
	}
	//獲取長
	int getL()
	{
		return m_L;
	}
	//獲取寬
	int getW()
	{
		return m_W;
	}
	//獲取高
	int getH()
	{
		return m_H;
	}
	//獲取面積
	int calculateS()
	{
		return 2 * (m_L * m_W + m_L * m_H + m_W * m_H);
	}
	//獲取體積
	int calculateV()
	{
		return m_L * m_H * m_W;
	}
	//利用成員函數判斷兩個立方體是否相等
	bool isSameByClass(Cube& c)
	{
		if (m_H == c.getH() && m_L == c.getL() && m_W == c.getW())
			return true;
		else
			return false;
	}
private:
	int m_L;//長
	int m_W;//寬
	int m_H;//高
};
//利用全局函數判斷兩個立方體是否相等
bool isSame(Cube &c1,Cube &c2)
{
	if (c1.getH() == c2.getH() && c1.getL() == c2.getL() && c1.getW() == c2.getW())
		return true;
	else
		return false;
}
int main()
{
	Cube c1;
	c1.setH(10);
	c1.setL(13);
	c1.setW(45);
	cout << "c1面積是:" << c1.calculateS() << endl;
	cout << "c2體積是:" << c1.calculateV() << endl;
	Cube c2;
	c2.setH(10);
	c2.setL(13);
	c2.setW(45);
//利用全局函數判斷
	if (isSame(c1, c2))
		cout << "c1和c2相等" << endl;
	else
		cout << "c1和c2不相等" << endl;
//利用成員函數判斷
	if (c1.isSameByClass(c2))
		cout << "c1和c2相等" << endl;
	else
		cout << "c1和c2不相等" << endl;
	system("pause");
	return 0;
}

案例2:點和圓的關系

要求:設計一個圓類型(Cricle),和一個(Point),計算點和圓的關系。
1. 點在圓外
2.點在圓內
3.點在圓上

#include<iostream>
using namespace std;
class Point
{
public:
	//設置x
	void setX(int x)
	{
		m_X = x;
	}
	//設置y
	void setY(int y)
	{
		m_Y = y;
	}
	//獲取x
	int  getX()
	{
		return m_X;
	}
	int getY()
	{
		return m_Y;
	}
private:
	int m_X;
	int m_Y;

};
class Circle
{
public:
	//設置半徑
	void setR(int r)
	{
		m_R = r;
	}
	//獲取半徑
	int getR()
	{
		return m_R;
	}
	//設置圓心
	void setCenter(int x, int y)
	{
		m_Center.setX(x);
		m_Center.setY(y);
	}
	//獲取圓心
	Point getCenter()
	{
		return m_Center;
	}
private:
	int m_R; //半徑
	Point m_Center;//圓心
};
//判斷點和圓的關系
void isInCircle(Circle& c, Point& p)
{
	//計算距離的平方
	int distance = (c.getCenter().getX() - p.getX()) * (c.getCenter().getX() - p.getX()) +
		           (c.getCenter().getY() - p.getY()) * (c.getCenter().getY() - p.getY());
	//計算半徑的平方
	int RDistance = c.getR() * c.getR();
	//判斷關系
	if (distance == RDistance)
		cout << "點在圓上" << endl;
	else if (distance > RDistance)
		cout << "點在圓外" << endl;
	else
		cout << "點在圓內" << endl;
}
int main()
{
	//創建一個圓
	Circle c;
	c.setR(10);
	c.setCenter(10, 0);
	Point p;
	p.setX(10);
	p.setY(10);
	//判斷關系
	isInCircle(c,p);
	system("pause");
	return 0;
}

總結

到此這篇關於C++類和對象之封裝詳解的文章就介紹到這瞭,更多相關C++封裝內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: