c++面向对象三大特性为:封装、继承、多态
c++认为万事万物都皆为对象,对象上有其属性和行为
具有相同性质的对象,我们可以抽象称为类,人属于认类,车属于车类
13.1封装的意义
封装是面向对象三大特性之一
封装的意义:
将属性和行为作为一个整体,表现生活中的事物
将属性和行为加以权限控制
13.2封装意义
13.2.1封装意义一(语法)
在设计类的时候,属性和行为写在一起,表现事物
语法:class 类名{ 访问权限: 属性 / 行为 };
#include
using namespace std;
const double PI = 3.14;//定义Π
class Circle
{
public://公共权限
int m_r;//半径
double calculateZC()//获取圆的周长
{
return 2 * PI * m_r;
}
};
int main()
{
Circle c1;//通过圆类创建具体的园(对象)实例化(通过一个类,创建一个对象的过程)
c1.m_r = 10;//给圆对象的属性进行赋值
cout << "圆的周长为:" << c1.calculateZC() << endl;
system("pause");
return 0;
}
eg:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
第一种
#include
using namespace std;
class Student
{
public:
string m_Name; //姓名
int m_Id; //学号
void showStudent()
{
cout << "学生姓名为:" << m_Name << " 学生学号为:" << m_Id << endl;
}
};
int main()
{
Student s1;
s1.m_Name = "大傻";
s1.m_Id = 191818;
s1.showStudent();//给s1对象赋值
system("pause");
return 0;
}
第二种
#include
using namespace std;
class Student
{
public:
void setName(string name)
{
m_Name = name;
}
void setId(int id)
{
m_Id = id;
}
void showStudent()
{
cout << "学生姓名为:" << m_Name << " 学生学号为:" << m_Id << endl;
}
public:
string m_Name; //姓名
int m_Id; //学号
};
int main()
{
Student s2;
s2.setName("二蛋");//传给void setName(string name)的name,之后传给里面m_Name = name;
s2.setId(191819);
s2.showStudent();
system("pause");
return 0;
}
总结:类中的属性和行为我们统一称为成员
属性(称呼) 成员属性 成员变量
行为(称呼) 成员函数 成员方法
13.2.2封装意义二(访问权限)
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
public 公共权限(类内可以访问,类外可以访问)
protected 保护权限(类内可以访问,类外不可以访问)(子类可以访问父类中的保护内容)
private 私有权限(类内可以访问,类外不可以访问)(子类不可以访问父类中的私有内容)
#include
using namespace std;
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 p1;
p1.m_Name = "李四";
//p1.m_Car = "奔驰";放在类外会报错,保护权限内容在类外访问不到
//p1.m_Password = 654321;放在类外会报错,私有权限内容在类外访问不到
system("pause");
return 0;
}
13.3struct和class区别
在c++中struct和class唯一区别在于默认的访问权限不同
struct默认权限为公共
class默认权限为私有
13.4成员属性设置为私有
优点:
将所有成员属性设置为私有,可以控制读写权限
对于写权限,我们可以检测数据的有效性
13.4.1将所有成员属性设置为私有,可以控制读写权限
#include
using namespace std;
class Person
{
public:
void setName(string name) //设置姓名 可读可写
{
m_Name = name;
}
string getName()//获取姓名
{
return m_Name;
}
int getAge() //获取年龄 可读
{
m_Age = 0; //初始化为0岁
return m_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;
cout << "年龄为:" << p.getAge() << endl;
p.setLover("三丫");//不可以访问到此
//cout << "情人名为:" << p.getLover() << endl;会报错,没用定义getLover
system("pause");
return 0;
}
13.4.2对于写权限,我们可以检测数据的有效性
#include
using namespace std;
class Person
{
public:
void setName(string name)//设置姓名
{
m_Name = name;
}
string getName()
{
return m_Name;
}
void setAge(int age)
{
if (age < 0 || age>150)
{
m_Age = 0;
cout << "输入的结果有误" << endl;
return;
}
m_Age = age;
}
int getAge()
{
return m_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(18);
cout << "年龄为:" << p.getAge() << endl;
p.setLover("三丫");
system("pause");
return 0;
}
13.5例题
13.5.1设计立方体类(Cube)
#include
using namespace std;
class Cube
{
public:
void setL(int l)//设置长
{
m_L = l;
}
int getL()//获取长
{
return m_L;
}
void setW(int w)//设置宽
{
m_W = w;
}
int getW()//获取宽
{
return m_W;
}
void setH(int h)//设置高
{
m_H = h;
}
int getH()//获取高
{
return m_H;
}
int calculateS()
{
return 2 * m_L * m_W + 2 * m_L * m_H + 2 * m_W * m_H;
}
int calculateV()
{
return m_L* m_W* m_H;
}
bool isSameByClass(Cube&a)//成员函数中已经有m_L就不用写a1.getL()了,a2.getL()是外来的,可换成a.getL()
{
if (m_L == a.getL() && m_W == a.getW() && m_H == a.getH())
{
return true;
}
return false;
}
private://
int m_L;//长
int m_W;//宽
int m_H;//高
};
bool isSame(Cube a1,Cube a2)//利用全局函数判断两个立方体是否相等
{
if (a1.getL() == a2.getL() && a1.getW() == a2.getW() && a1.getH() == a2.getH())
{
return true;
}
return false;
}
int main()
{
Cube a1;//创建立方体对象a1
a1.setL(10);
a1.setW(10);
a1.setH(10);
cout<<"a1表面积为:"<
13.5.2点和圆的关系
设计一个圆形类(Circle),和一个点类(Point),计算点和圆的关系
#include
using namespace std;
class Point
{
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;
}
private:
int m_X;
int m_Y;
};
class Circle
{
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;
}
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);
Point center;
center.setX(10);
center.setY(0);
c.setCenter(center);
Point p;//创建点
p.setX(10);
p.setY(10);
isInCircle(c, p);//判断关系
system("pause");
return 0;
}
另一种放置方式
在头文件创建point.h
#pragma once//防止头文件重复包含
#include
using namespace std;
class Point//留下了函数声明和变量声明
{
public:
void setX(int x);
int getX();
void setY(int y);
int getY();
private:
int m_X;
int m_Y;
};
在源文件创建point.cpp
#include"point.h"
void Point::setX(int x)//因为是成员函数,现在在全局函数中,加Point变成Point作用域下函数
{
m_X = x;
}
int Point::getX()//留下所有函数即可
{
return m_X;
}
void Point::setY(int y)
{
m_Y = y;
}
int Point::getY()
{
return m_Y;
}
在头文件创建Clircle.h
#pragma once//防止头文件重复包含
#include
using namespace std;
#include "Point.h"
class Circle
{
public:
void setR(int r);
int getR();
void setCenter(Point center);
Point getCenter();
private:
int m_R;//半径
Point m_Center;//圆心
};
在源文件创建Clircle.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;
}
hello.cpp中剩
#include
using namespace std;
#include"Circle.h"
#include"point.h"
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);
Point center;
center.setX(10);
center.setY(0);
c.setCenter(center);
Point p;//创建点
p.setX(10);
p.setY(10);
isInCircle(c, p);//判断关系
system("pause");
return 0;
}
总结:在类中可以让另一个类,作为本来中的成员
.cpp中告诉成员函数.h中留下成员函数的声明和成员属性的声明