C++自学笔记

这篇博客探讨了C++中的类和对象,重点讲述了封装的概念和重要性,包括封装的意义、权限控制(public, protected, private)。此外,讨论了struct与class的区别,并给出了几个实践案例,如设计长方体类和点与圆的关系,强调了通过封装来实现对象的属性和行为控制。" 4296023,83840,C++初学者指南:对象、类型与控制结构,"['C++', '编程语言', '结构', '控制流', '对象基础']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

13 类和对象_封装

本次记录13类和对象–封装,还请各位大佬批评指正!

类和对象

C++面向对象的三大特性:封装、继承、多态。
C++认为万事万物都为对象,对象有其属性和行为。例如:
人可以作为对象,属性有姓名,年龄,身高,体重… ; 行为有走,跑,跳,吃饭,唱歌…
车可以作为对象,属性有轮胎,方向盘,车灯… ; 行为有载人,放音乐,开空调…
具有相同性质的对象,我们可以称之为类,人属于人类,车属于车类。

封装

封装是C++面向对象三大特性之一。
封装的意义:
1、将属性和行为作为一个整体,表现生活中的事物;
2、将属性和行为加以权限控制。

封装的意义一

在设计类的时候,属性和行为写在一起,表现事物。
语法:class 类名 { 访问权限: 属性 / 行为 };

示例一:设计一个圆类,求圆的周长。

#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;

const double PI = 3.14;

//设计一个圆类,求圆的周长 2 * PI * R
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;
}

示例二:设计一个学生类,属性有姓名和学号,可以给姓名和学号赋值,可以显示学生的姓名和学号。

#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;

//设计学生类
class student
{
	//权限
public://公共权限

	//类中的属性和行为我们统一称为成员
	//属性 成员属性/成员变量
	string s_name;
	int s_num;

	//行为 成员函数/成员方法
	//显示姓名和学号
	void showstudent()
	{
		cout << "姓名:" << s_name << "学号:" << s_num << endl;
	}

	//给姓名赋值
	void setname(string name)
	{
		s_name = name;
	}
	//给学号赋值
	void setnum(int num)
	{
		s_num = num;
	}
};
int main()
{
	//创建一个具体的学生 实例化对象
	student s1;
	//给s1对象进行赋值操作
	s1.s_name = "张三";
	s1.s_num = 1;
	//显示学生信息
	s1.showstudent();

	student s2;
	//给s1对象进行赋值操作
	s2.setname("李四");
	s2.setnum(2);
	//显示学生信息
	s2.showstudent();


	system("pause");

	return 0;
}

封装的意义二

类在实际时,可以把属性和行为放在不同的权限下,加以控制。
三种权限:
1、公共权限: public 成员 类内可以访问,类外也可以访问。
2、保护权限: protected 成员 类内可以访问,类外不可以访问( 儿子可以访问父亲的保护内容)。
3、私有权限: private 成员 类内可以访问,类外不可以访问(儿子不可以访问父亲的私有内容)。

#include<iostream>
#include <stdlib.h>
#include<string>
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 = 123;//私有权限内容,类外访问不到
	p1.func();


	system("pause");

	return 0;
}

struct和class的区别

C++中struct和class唯一区别在于:默认的访问权限不同。struct默认权限为公共;class默认权限为私有。

#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;

class c1
{
	int m_a;//默认权限 私有
};

struct c2
{
	int m_b;//默认权限 公共
};

int main()
{
	c1 C1;//class 私有,类外不可访问
	//C1.m_a = 10;

	c2 C2;//struct 公共,类外可以访问
	C2.m_b = 10;


	system("pause");

	return 0;
}

成员属性设为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限。
优点2:对于写权限,我们可以检测数据的有效性 。

#include<iostream>
#include <stdlib.h>
#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)//判断有效性
		{
			m_age = 0;
			cout << "输入年龄有误!" << endl;
			return;
		}
		m_age = age;
	}
	//获取年龄
	int getage()
	{
		//m_age = 20;//初始化
		return m_age;
	}
	//设置情人
	void setlover(string lover)
	{
		m_lover = lover;
	}

private:
	string m_name;//姓名 可读可写
	int m_age;//年龄 可读可写 如果想修改,则范围必须是 0~150
	string m_lover;//情人 只写
};

int main()
{
	person p1;
	p1.setname("张三");
	cout << "姓名:" << p1.getname() << endl;

	//p1.m_age = 18;
	p1.setage(20);
	cout << "年龄:" << p1.getage() << endl;

	p1.setlover("苍老师");
	//cout << "情人:" << p1.setlover() << endl;//不可以访问

	system("pause");

	return 0;
}

练习案例1:设计长方体类

要求:
设计长方体类(cube);
求出长方体的面积和体积;
分别用全局函数和成员函数判断两个长方体是否相等。

#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;

//练习案例1:设计长方体类
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_h * m_w;
	}

	//计算体积
	int calculateV()
	{
		return m_l * m_w * m_h;
	}

	//利用成员函数判断两个长方体是否相等
	bool issamebyclass(cube& c)
	{
		if (m_l == c.getl() && m_w == c.getw() && m_h == c.geth())
		{
			return true;
		}
		return false;
	}

private:
	int m_l;//长
	int m_w;//宽
	int m_h;//高

};

//利用全局函数判断立方体是否相等
bool issame(cube& c1, cube& c2)
{
	if (c1.getl() == c2.getl() && c1.getw() == c2.getw() && c1.geth() == c2.geth())
	{
		return true;
	}
	return false;
}


int main()
{
	cube c1;
	c1.setl(10);
	c1.setw(20);
	c1.seth(20);
	cout << "c1的面积为:" << c1.calculateS() << endl;
	cout << "c1的体积为:" << c1.calculateV() << endl;

	cube c2;
	c2.setl(10);
	c2.setw(20);
	c2.seth(20);

	//利用全局函数判断长方体是否相等
	bool ret1 = issame(c1, c2);//全局函数调用一个参数
	if (ret1)
	{
		cout << "全局函数判断c1和c2相等" << endl;
	}
	else
	{
		cout << "全局函数判断c1和c2不相等" << endl;
	}

	//利用成员函数判断长方体是否相等
	bool ret2 = c1.issamebyclass(c2);//成员函数调用一个参数
	if (ret2)
	{
		cout << "成员函数判断c1和c2相等" << endl;
	}
	else
	{
		cout << "成员函数判断c1和c2不相等" << endl;
	}


	system("pause");

	return 0;
}

练习案例2:点和圆的关系

设计一个圆形类(circle)和一个点类(point),计算点和圆的关系。

#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;

//点类
class point
{
public:
	//设置X
	void setx(int x)
	{
		m_x = x;
	}
	//获取X
	int getx()
	{
		return m_x;
	}

	//设置Y
	void sety(int y)
	{
		m_y = y;
	}
	//获取Y
	int gety()
	{
		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(0);
	center.sety(0);
	c.setcenter(center);

    //创建点
	point p1;
	p1.setx(10);
	p1.sety(0);

	point p2;
	p2.setx(1);
	p2.sety(0);

	point p3;
	p3.setx(10);
	p3.sety(10);

    //判断关系
	isincircle(c, p1);
	isincircle(c, p2);
	isincircle(c, p3);


	system("pause");

	return 0;
}

练习案例2:点和圆的关系(拆分)

1、新建 point.h 头文件

#pragma once
#include<iostream>
using namespace std;


//点类
class point
{
public:
	//设置X
	void setx(int x);
	//获取X
	int getx();

	//设置Y
	void sety(int y);
	//获取Y
	int gety();


private:
	int m_x;
	int m_y;
};

2、新建 point.cpp 文件

#include "point.h"

//设置X
void point::setx(int x)
{
	m_x = x;
}
//获取X
int point::getx()
{
	return m_x;
}

//设置Y
void point::sety(int y)
{
	m_y = y;
}
//获取Y
int point::gety()
{
	return m_y;
}


3、新建 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;
};

4、新建 circle.cpp 文件

#include "circle.h"

//快捷键 Ctrl + K + F 取消缩进

//设置半径
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;
}


#include<iostream>
#include <stdlib.h>
#include<string>
using namespace std;
#include "point.h"
#include "circle.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(0);
	center.sety(0);
	c.setcenter(center);

    //创建点
	point p1;
	p1.setx(10);
	p1.sety(0);

	point p2;
	p2.setx(1);
	p2.sety(0);

	point p3;
	p3.setx(10);
	p3.sety(10);

    //判断关系
	isincircle(c, p1);
	isincircle(c, p2);
	isincircle(c, p3);


	system("pause");

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值