C++面向对象的三大特性:封装、继承、多态
具有相同性质的对象,抽象为类
4.1 封装
封装的意义:将属性和行为作为一个整体,表现生活中的事物,并将属性和行为加以权限控制。
4.1.1 类的定义及实例化对象
语法:class 类名{访问权限:属性/行为};
类中的属性和行为统称为成员,属性也可以称为成员属性或成员变量,行为也可以称为成员函数或成员方法。
代码如下:
cpp
#include <iostream>
using namespace std;
//设计一个圆类,求圆的周长
const double PI=3.14;
//class代表设计一个类,类后面紧跟的是类名称
class Circle
{
//访问权限
public://公共权限
//属性
//半径
int r;
//行为:获取圆的周长
double calculateZC()
{
return 2*PI*r;
}
};
int main()
{
//实例化:通过圆类,创建具体的圆(对象)
Circle c1;
//给圆对象的属性进行赋值
c1.r=10;
cout<<"圆的周长为:"<<c1.calculateZC()<<endl;
return 0;
}
输出如下:

4.1.2 访问权限
访问权限分为三种:
- 公共权限:类内外都可以访问成员
- 保护权限:类内可以访问成员,类外不能访问
- 私有权限:类内可以访问成员,类外不能访问
代码如下:
cpp
#include <iostream>
using namespace std;
class Person
{
//公共权限
public:
string name;
//保护权限
protected:
string car;
//私有权限
private:
int passwd;
public:
void func()
{
name="ddd";
car="bench";
passwd=4444;
}
};
int main()
{
//实例化一个对象
Person p1;
//给圆对象的属性进行赋值
p1.name="dddd";
//p1.car="paosij";
//p1.passwd=1234;
return 0;
}
错误示例:修改保护权限和私钥权限的属性。

成员属性设置为私有,可以自己控制读写权限,对于写权限,可以检测数据的有效性。
代码如下:
cpp
#include <iostream>
using namespace std;
class Person
{
public:
//设置姓名
void setName(string name)
{
m_name=name;
}
//获取姓名
string getName()
{
return m_name;
}
//获取年龄
int getAge()
{
return m_age;
}
//设置偶像
void setIdol(string idol)
{
m_idol=idol;
}
private:
string m_name;//姓名 可读可写
int m_age=18;//年龄 只读
string m_idol;//偶像 只写
};
int main()
{
//实例化一个对象
Person p;
//设置姓名
p.setName("ddd");
//获取姓名
cout<<"姓名:"<<p.getName()<<endl;
//设置年龄,不存在该函数
//p.setAge("ddd");//报错 不存在该成员setAge
//p.m_age=23;//报错 无法访问
//获取年龄
cout<<"年龄:"<<p.getAge()<<endl;
//设置偶像
p.setIdol("huge");
//获取偶像,没有获取函数
//cout<<"偶像:"<<p.getIdol()<<endl;//报错 不存在该成员getIdol
//cout<<"偶像:"<<p.m_idol()<<endl;//报错 无法访问
return 0;
}
错误示例:

4.1.3 struct 与 class
- struct默认权限为公共
- class默认权限为私有
错误示例:访问class中默认权限下的成员。

4.1.4 案例1:立方体类
题目:设计立方体类,求出立方体的面积和体积,分别用全局函数和成员函数判断两个立方体是否相等。
代码如下:
cpp
#include <iostream>
using namespace std;
class Cube
{
private:
//属性:长宽高
int l;
int w;
int h;
public:
//设置\获取属性
void setLong(int ll)
{
l=ll;
}
int getLong()
{
return l;
}
void setWidth(int ww)
{
w=ww;
}
int getWidth()
{
return w;
}
void setHeight(int hh)
{
h=hh;
}
int getHeight()
{
return h;
}
//方法:计算面积、体积、判断两个立方体是否相等
int getSquare()
{
return 2*(l*h+h*w+h*w);
}
int getVolume()
{
return l*w*h;
}
//利用成员函数判断两个立方体是否相等
void isEqual(Cube &c)
{
if(l==c.getLong() && w==c.getWidth() && h==c.getHeight())
{
cout<<"两个立方体相同"<<endl;
}
else
{
cout<<"两个立方体不同"<<endl;
}
}
};
//利用全局函数判断两个立方体是否相等
void isSame(Cube &c1,Cube &c2)
{
if(c1.getLong()==c2.getLong() && c1.getWidth()==c2.getWidth() && c1.getHeight()==c2.getHeight())
{
cout<<"两个立方体相同"<<endl;
}
else
{
cout<<"两个立方体不同"<<endl;
}
}
int main()
{
//创建对象
Cube c1;
c1.setLong(1);
c1.setWidth(2);
c1.setHeight(3);
cout<<"c1的面积为:"<<c1.getSquare()<<endl;
cout<<"c1的体积为:"<<c1.getVolume()<<endl;
Cube c2;
c2.setLong(1);
c2.setWidth(2);
c2.setHeight(3);
//判断两个立方体是否相等
isSame(c1,c2);
c1.isEqual(c2);
c2.setLong(2);
isSame(c1,c2);
c1.isEqual(c2);
return 0;
}
输出如下:

4.1.5 案例2:点和圆(分文件)
题目:设计一个圆形类和一个点类,计算点和圆的关系。
代码如下:
cpp
#include <iostream>
using namespace std;
//点类
class Point
{
private:
int p_x;
int p_y;
public:
//设置/获取X,Y
void setX(int x)
{
p_x=x;
}
int getX()
{
return p_x;
}
void setY(int y)
{
p_y=y;
}
int getY()
{
return p_y;
}
};
//圆类
class Circle
{
private:
int c_r;//半径
Point center;//圆心
public:
//设置/获取半径圆心
void setR(int r)
{
c_r=r;
}
int getR()
{
return c_r;
}
void setCer(Point cer)
{
center=cer;
}
Point getCer()
{
return center;
}
};
//判断点和圆的关系
void isInCircle(Circle &c,Point &p)
{
int dist=(c.getCer().getX()-p.getX()) * (c.getCer().getX()-p.getX())+
(c.getCer().getY()-p.getY()) * (c.getCer().getY()-p.getY());
int rdist=c.getR() * c.getR();
if(dist==rdist)
{
cout<<"点在圆上"<<endl;
}
else if(dist>rdist)
{
cout<<"点在圆外"<<endl;
}
else
{
cout<<"点在圆内"<<endl;
}
}
int main()
{
//创建点对象和圆对象
Point p;
Circle c;
Point center;
//设置点的坐标
p.setX(0);
p.setY(0);
//设置园的半径及圆心的坐标
c.setR(10);
center.setX(10);
center.setY(0);
c.setCer(center);
//判断点与圆的关系
isInCircle(c,p);
return 0;
}
输出如下:

分文件编写:
point.h
cpp
#pragma once//防止头文件重复包含
#include <iostream>
using namespace std;
//点类
class Point
{
private:
int p_x;
int p_y;
public:
//设置/获取X,Y
void setX(int x);
int getX();
void setY(int y);
int getY();
};
point.cpp
cpp
#include "point.h"
//点类
//设置/获取X,Y
void Point::setX(int x)//Point::的作用是声明该函数是Point作用域下的成员函数
{
p_x=x;
}
int Point::getX()
{
return p_x;
}
void Point::setY(int y)
{
p_y=y;
}
int Point::getY()
{
return p_y;
}
circle.h
cpp
#pragma once
#include <iostream>
using namespace std;
#include "point.h"
//圆类
class Circle
{
private:
int c_r;//半径
Point center;//圆心
public:
//设置/获取半径圆心
void setR(int r);
int getR();
void setCer(Point cer);
Point getCer();
};
circle.cpp
cpp
#include "circle.h"
//圆类
//设置/获取半径圆心
void Circle::setR(int r)
{
c_r=r;
}
int Circle::getR()
{
return c_r;
}
void Circle::setCer(Point cer)
{
center=cer;
}
Point Circle::getCer()
{
return center;
}
main.cpp
cpp
#include <iostream>
using namespace std;
#include "point.h"
#include "circle.h"
//判断点和圆的关系
void isInCircle(Circle &c,Point &p)
{
int dist=(c.getCer().getX()-p.getX()) * (c.getCer().getX()-p.getX())+
(c.getCer().getY()-p.getY()) * (c.getCer().getY()-p.getY());
int rdist=c.getR() * c.getR();
if(dist==rdist)
{
cout<<"点在圆上"<<endl;
}
else if(dist>rdist)
{
cout<<"点在圆外"<<endl;
}
else
{
cout<<"点在圆内"<<endl;
}
}
int main()
{
//创建点对象和圆对象
Point p;
Circle c;
Point center;
//设置点的坐标
p.setX(0);
p.setY(0);
//设置园的半径及圆心的坐标
c.setR(10);
center.setX(10);
center.setY(0);
c.setCer(center);
//判断点与圆的关系
isInCircle(c,p);
return 0;
}