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