A)封裝,是面向對象程序設計最基本的特性。把數據(屬性)和函數(操作)合成一個整體,這在計算機世界中是用類與對象實現的。
B)封裝,把客觀事物封裝成抽象的類,并且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。
備注:有2層含義(把屬性和方法進行封裝 對屬性和方法進行訪問控制)
C++中類的封裝
成員變量,C++中用于表示類屬性的變量
成員函數,C++中用于表示類行為的函數
在C++中可以給成員變量和成員函數定義訪問級別
public修飾成員變量和成員函數可以在類的內部和類的外部被訪問
private修飾成員變量和成員函數只能在類的內部被訪問
沒有權限修飾的成員和函數默認是private的
#include <stdio.h>
#include <iostream>using namespace std;const float pi = 3.14f;struct Circle
{float r; // 半徑float s; // 面積
};int main1_1()
{Circle c;cout << "請輸入半徑: ";cin >> c.r;cout << "圓的面積是: "<< c.r*c.r*pi << endl;return 0;
}// class 新的關鍵字,用聲明類
// 在類中,成員變量 叫 屬性
// 在類中,成員函數 叫 方法
class MyCircle
{
public: // 公有屬性,它所修飾的東西類內部外部都可以訪問// 用來對半徑進行賦值void setR(float r){m_r = r;m_s = r * r * pi;}float GetR(){return m_r;}float GetS(){return m_s;}private: // 訪問控制關鍵字,在它修飾下的所有東西都是只能在類的內部訪問,外部不能訪問float m_r; // 半徑 屬性float m_s; // 面積 屬性
};int main1_2()
{// 用類來定義的變量,叫 對象,對象是類的一個實例// 用法和結構體一樣MyCircle c,c1,c2,c3;c.setR(2); // 將半徑設成2c1.setR(3);c2.setR(4);c3.setR(5);cout << "半徑是: " << c.GetR() << ", 面積是: " << c.GetS() << endl;cout << "半徑是: " << c1.GetR() << ", 面積是: " << c1.GetS() << endl;cout << "半徑是: " << c2.GetR() << ", 面積是: " << c2.GetS() << endl;cout << "半徑是: " << c3.GetR() << ", 面積是: " << c3.GetS() << endl;return 0;
}// 類的訪問控制
// public: 公有屬性,類內部外部都可以訪問
// private: 私有屬性,只能在類的內部訪問
// protect: 保護屬性,用在繼承中,也只能在類的內部訪問// 結構體與類的區別// 結構體不寫訪問控制的情況下,默認是公有的
struct A
{int a;
};// 類中如果不寫訪問控制,默認的屬性是私有的
class CA
{int a;
};
int main1_3()
{A a;a.a;//CA b;// b.a;return 0;
}
類的兩個實際運用:
1. 學生信息:
頭文件 student.h:
#ifndef __STUDNET_H__
#define __STUDNET_H__#include <stdio.h>
#include <string.h>
#include <string.h>class student
{
public:void setstu(int id, int age, char* name);void print();
private:int m_id;int m_age;char m_name[10];
};#endif
源文件 student.cpp
#include "student.h"void student::setstu(int id, int age, char* name)
{m_id = id;m_age = age;strcpy(m_name, name);
}void student::print()
{printf ("id = %d, age = %d, name = %s\n", m_id, m_age, m_name);
}
mian.cpp
#include "student.h"int main0()
{student s;s.setstu(1, 18, "wang");s.print();return 0;
}
2.平面上一點是否在圓內:
頭文件 Point.h:
#ifndef __POINT_H__
#define __POINT_H__class Point
{
public:// 設置點的坐標void setXY(int x, int y);int getX();int getY();// 求當前的點和另一個點的距離的平方int distance(Point &p);private:int m_x; // x的坐標int m_y; // y的坐標
};#endif //__POINT_H__
Circle.h:
#ifndef __CIRCLE_H__
#define __CIRCLE_H__
#include "Point.h"class Circle
{
public:void setCircle(int r, int x, int y);bool inCircle(Point &p);private:int m_r; // 半徑Point m_rp; // 圓心
};#endif // __CIRCLE_H__
源文件Point.cpp
#include "Point.h"void Point::setXY(int x, int y)
{m_x = x;m_y = y;
}int Point::getX()
{return m_x;
}
int Point::getY()
{return m_y;
}int Point::distance(Point &p)
{int dis = (m_x - p.getX())*(m_x - p.getX()) + (m_y - p.getY()) * (m_y - p.getY());// int dis = (m_x - p.m_x)*(m_x - p.m_x) + (m_y - p.m_y) * (m_y - p.m_y);return dis;
}
Circle.cpp
#include "Circle.h"void Circle::setCircle(int r, int x, int y)
{m_r = r; // 設置半徑m_rp.setXY(x, y); // 設置圓心
}bool Circle::inCircle(Point &p)
{if (m_rp.distance(p) <= m_r*m_r) // 點p 到 圓心的長度小于等于半徑return true;elsereturn false;
}
main.cpp
#include <stdio.h>
#include "Circle.h"
#include "Point.h"int main()
{Circle c;c.setCircle(20, 20, 20);Point p;p.setXY(10,20);if (c.inCircle(p)){printf ("在圓內\n");}else{printf ("在圓外\n");}return 0;
}