C++学习笔记——类与对象-封装

最近在学习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;
}

运行结果:
在这里插入图片描述

封装意义二:
类在设计时,可以把属性和行为放在不同的权限下,加以控制
访问权限有三种:

  1. public : 公共权限
  2. protected : 保护权限
  3. 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;
}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

%Zero%

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值