最近在学习C++ ,下面整理学习的步骤和笔记,以便日后查看,希望对读者有帮助。 若喜欢的话可以三连支持一下,谢谢!
封装
封装是C++面向对象三大特性之一
封装的意义:
- 将属性和行为作为一个整体,表现生活中的事物
- 将属性和行为加以权限控制
封装意义一:
在设计类的时候,属性和行为写在一起,表现事物
语法:class 类名{访问权限 : 属性 / 行为};
设计一:设计一个圆类,求圆的周长
#include <iostream>
using namespace std;
#define PI 3.14
//设计一个圆类,求圆的周长 L = 2 * PI * r
//class 代表设计一个圆类,类后面紧跟着就是类的名称
class Circle
{
//访问权限
//公共权限
public:
//属性
//半径
int m_R; //半径
//行为
//获取圆的周长
double get_circumference()
{
return 2 * PI * m_R;
}
};
int main()
{
//通过圆类,创建对象
Circle c1;
//给圆对象的属性进行赋值
c1.m_R = 10;
cout << "圆的周长为 : " << c1.get_circumference() << endl;
system("pause");
return 0;
}
运行结果:
设计二:设计一个学生,具有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号
#include <iostream>
using namespace std;
//设计学生类
class Student
{
public: //公共权限
//属性
string m_Name; //姓名
int m_ID; // 学号
//行为
//显示姓名和学号
void showStudent()
{
cout << "姓名为: " << m_Name << " 学号为:" << m_ID << endl;
}
};
int main()
{
Student stu1;
stu1.m_Name = "张三";
stu1.m_ID = 1;
stu1.showStudent();
Student stu2;
stu2.m_Name = "李四";
stu2.m_ID = 2;
stu2.showStudent();
system("pause");
return 0;
}
#include <iostream>
#include <string>
using namespace std;
//设计学生类
class Student
{
public: //公共权限
//属性 成员属性
//行为 成员函数 或 成员方法
string m_Name; //姓名
int m_ID; // 学号
//行为
//显示姓名和学号
void showStudent()
{
cout << "姓名为: " << m_Name << " 学号为:" << m_ID << endl;
}
//给姓名赋值
void setName(string name)
{
m_Name = name;
}
//给学号赋值
void setID(int id)
{
m_ID = id;
}
};
int main()
{
Student stu1;
stu1.setName("张三");
stu1.setID(1);
stu1.showStudent();
//Student stu2;
//stu2.m_Name = "李四";
//stu2.m_ID = 2;
//stu2.showStudent();
system("pause");
return 0;
}
运行结果:
封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:
- public : 公共权限
- protected : 保护权限
- private : 私有权限
class Person
{
public: //公共权限
string m_Name; //姓名
protected: //保护权限
string m_Car; //汽车
private: //私有权限
int m_Password; //银行卡密码
private:
void func() //类内可以访问
{
m_Name = "张三";
m_Car = "拖拉机";
m_Password = 12389;
}
};
struct 和 class 区别
在C++中struct 和 class 唯一的区别就在于默认的访问权限不同
区别:
struct默认权限为公共
class默认权限为私有
struct 没有报错
成员属性设置为私有
优点1:将所有成员属性设置为私有,可以自己控制读写权限
优点2:对于写权限,我们可以检测数据的有效性
#include <iostream>
#include <string>
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)
return;
m_Age = age;
}
//获取年龄
int GetAge()
{
//m_Age = 18;
return m_Age;
}
//设置情人
void setLover(string lover)
{
m_Lover = lover;
}
private:
//姓名 可读可写
string m_Name;
//年龄 只读
int m_Age;
//情人 只写
string m_Lover;
};
int main()
{
Person p1;
p1.setName("张三");
cout << "姓名为: " << p1.getName() << endl;
p1.setLover("李四");
p1.setAge(18);
cout << " 年龄为 " << p1.GetAge() << endl;
// cout << "情人是" << p1.m_Lover <<endl; //只写权限
system("pause");
return 0;
}
联系案例1:设计立方体类
设计立方体类(Cube)
求出立方体的面积和体积
分别用全局函数和成员函数判断两个立方体是否相等
#include <iostream>
#include <string>
using namespace std;
//创建立方体的类
class Cube
{
public:
void setLength(int length) //设置长
{
m_L = length;
}
int getLength() //获取长
{
return m_L;
}
void setWidth(int width) //设置宽
{
m_W = width;
}
int getWidth() //获取宽
{
return m_W;
}
void setHeight(int height) //设置高
{
m_H = height;
}
int getHeight() //获取高
{
return m_H;
}
int calc_area() //获取面积
{
return 2 * (m_L * m_W + m_L * m_H + m_L * m_H);
}
int calc_volume() //获取体积
{
return m_L * m_W * m_H;
}
//利用成员函数来判断两个立方体是否相等
bool isSameByClass(Cube &c)
{
if (m_L == c.getLength() && m_W == c.getWidth() && m_H == c.getHeight())
{
return true;
}
return false;
}
private:
int m_L; //长
int m_W; //宽
int m_H; //高
};
//利用全局函数来判断两个立方体是否相等的
bool isSame(Cube &c1 ,Cube &c2)
{
if (c1.getLength() == c2.getLength() && c1.getWidth() == c2.getWidth() && c1.getHeight() == c2.getHeight())
{
return true;
}
return false;
}
int main()
{
Cube c1;
c1.setLength(10);
c1.setWidth(10);
c1.setHeight(10);
cout << "c1的面积为 : " << c1.calc_area() << endl;
cout << "c1的体积为 : " << c1.calc_volume() << endl;
Cube c2;
c2.setLength(10);
c2.setWidth(10);
c2.setHeight(10);
if (isSame(c1, c2))
cout << "c1 和 c2 是相等的" << endl;
else
cout << "c1 和 c2 是不相等的" << endl;
bool ret;
ret = c1.isSameByClass(c2);
if (ret)
cout << "c1 和 c2 是相等的" << endl;
else
cout << "c1 和 c2 是不相等的" << endl;
system("pause");
return 0;
}
练习案例2: 点和圆的关系
设计一个圆类(Circle),和一个点类(Point),计算点和圆的关系
分文件处理
circle.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;
}
circle.h的代码:
#pragma once
#include <iostream>
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; //圆心
};
point.cpp的代码:
#include "point.h"
void Point ::setX(int x) //设置x
{
m_X = x;
}
int Point::getX() //获取x
{
return m_X;
}
void Point::setY(int y) //设置y
{
m_Y = y;
}
int Point::getY() //获取y
{
return m_Y;
}
point.h的代码:
#pragma once
#include <iostream>
using namespace std;
//留下函数的声明和变量的声明
class Point
{
public:
void setX(int x); //设置x
int getX(); //获取x
void setY(int y); //设置y
int getY(); //获取y
private:
int m_X;
int m_Y;
};
主函数main的代码:
#include <iostream>
#include <string>
using namespace std;
#include "circle.h"
#include "point.h"
//判断点和圆关系
void isInCircle(Circle& c, Point& p)
{
//计算两点之间的距离 平方
int instance =
(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 (instance == rDistance)
cout << "点在圆上" << endl;
else if (instance > rDistance)
cout << "点在圆外" << endl;
else
cout << "点在圆内" << endl;
}
int main()
{
//创建一个圆
Circle c1;
c1.setR(10);
Point center;
center.setX(10);
center.setY(0);
c1.setCenter(center);
Point p;
p.setX(10);
p.setY(11);
isInCircle(c1, p);
system("pause");
return 0;
}
运行结果: