类和对象——封装

news/2024/12/21 22:10:45/

师从黑马程序员

封装

封装的意义一

在设计类的时候,属性和行为写在一起,表现事物

语法: class 类名{  访问权限:属性/行为  };

设计一个圆类,求圆的周长   代码:

示例1:

#include <iostream>
using namespace std;class Circle
{//访问权限//公共权限
public://属性//半径int m_r;//行为//获取圆的周长double calculateZC(){const float PI=3.14;return 2*PI*m_r;}
};int main()
{//通过圆类 创建具体的圆(对象)Circle c1;//给圆对象的属性进行赋值c1.m_r=10;cout<<"圆的周长为: "<<c1.calculateZC()<<endl;return 0;
}

示例2:

设计一个学生类,属性具有姓名和学号,姓名和学号可以赋值,并将其显示

#include <iostream>
using namespace std;class Student
{
public:// 定义构造函数,初始化姓名和学号Student(string name, int stuNum): m_name(name), m_stuNum(stuNum) {}// 姓名和学号的setter方法void setName(string name) { m_name = name; }void setStuNum(int stuNum) { m_stuNum = stuNum; }// 打印学生信息的方法void printStu(){cout << "学生姓名为:" << m_name << endl;cout << "学生学号为:" << m_stuNum << endl;}private:string m_name;int m_stuNum;
};int main()
{// 创建一个学生对象,并初始化姓名和学号Student s1("张三", 123456);// 调用打印学生信息的方法s1.printStu();return 0;
}

封装意义二:

类在设计时,可以把属性和行为放在不同的权限下,加以控制

访问权限有三种:

1、public   公共权限           成员  类内可以访问  类外可以访问

2、protected 保护权限        成员  类内可以访问  类外可以访问

3、private  私有权限           成员  类内可以访问  类外可以访问

#include <iostream>
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();return 0;
}

struct和class区别

在C++中,struct和class唯一的区别在于默认的访问权限不同

区别:

        struct默认权限为公共

        class默认权限为私有

#include <iostream>
using namespace std;class C1
{int m_A;
};struct C2
{int m_A;
};int main()
{C1 c1;// c1=100;  //在class里默认权限  私有,因此类外不可以访问C2 c2;c2=100;//在class里默认权限  公有,因此可以访问return 0;
}

成员属性设置为为私有

优点1:将所有成员属性设置为私有,可以自己控制读写权限

优点2:对于写权限,我们可以检测数据的有效性

#include <iostream>
#include<string >
using namespace std;class Person
{
public://设置姓名void setName(string name){m_Name=name;}//获取姓名string getName(){return m_Name;}//获取年龄int getAge(){return m_Age;}//设置年龄(0~150)void setAge(int age){if(age<0||age>150){cout<<"年龄输入有误,赋值失败"<<endl;return ;}m_Age=age;}//设置偶像void setIdol(string Idol){m_Idol=Idol;}
private:string m_Name; //姓名   可读可写int m_Age=18;  //年龄  只读  也可以写0~150string m_Idol;//偶像 只写
};
int main()
{Person p;//姓名设置p.setName("张三");//姓名获取cout<<"姓名: "<<p.getName()<<endl;//年龄设置p.setAge(160);//年龄获取cout<<"年龄: "<<p.getAge()<<endl;//只读//偶像设置p.setIdol("小明");//只写return 0;
}

联系案例1:设计立方体类

设计立方体类(Cube)

求出立方体的面积和体积

分别用全局函数和成员函数两个立方图是否相同

#include <iostream>
#include<string>
using namespace std;class Cube
{
private:int m_A;
public:// 构造函数初始化边长Cube(int A) : m_A(A) {}// 设置边长的成员函数void setA(int A){m_A = A;}// 获取边长的成员函数int getA(){return m_A;}// 计算面积的成员函数int getArea(){return m_A * m_A;}// 计算体积的成员函数int getVolume(){return m_A * m_A * m_A;}// 成员函数判断当前立方体与另一个立方体是否相同bool isSameCube(const Cube& other){return m_A == other.m_A;}
};// 全局函数判断两个立方体是否相同
bool areCubesSame(Cube c1, Cube c2)
{return c1.getA() == c2.getA();
}int main()
{Cube c1(10);Cube c2(5);cout << "立方体c1的边长为:" << c1.getA() << endl;cout << "立方体c1的面积为:" << c1.getArea() << endl;cout << "立方体c1的体积为:" << c1.getVolume() << endl;cout << "立方体c2的边长为:" << c2.getA() << endl;cout << "立方体c2的面积为:" << c2.getArea() << endl;cout << "立方体c2的体积为:" << c2.getVolume() << endl;// 使用成员函数判断是否相同cout << "成员函数判断:c1和c2是否相同?" << (c1.isSameCube(c2) ? "是" : "否") << endl;// 使用全局函数判断是否相同cout << "全局函数判断:c1和c2是否相同?" << (areCubesSame(c1, c2) ? "是" : "否") << endl;return 0;
}

联系案例2:点和圆的关系

设计一个圆形类(Circle)和一个电类(Point),计算点和圆的关系

#include <iostream>
using namespace std;
//点类
class Point
{
public://设置Xvoid setX(int x){m_X=x;}//获取Xint getX(){return m_X;}//设置Yvoid setY(int y){m_Y=y;}//获取Xint 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(10);center.setY(0);c.setCenter(center);//创建点Point p;p.setX(10);p.setY(10);//判断关系isInCircle(c,p);return 0;
}

 若有侵权,请联系作者


http://www.ppmy.cn/news/1350034.html

相关文章

【EAI 015】CLIPort: What and Where Pathways for Robotic Manipulation

论文标题&#xff1a;CLIPort: What and Where Pathways for Robotic Manipulation 论文作者&#xff1a;Mohit Shridhar1, Lucas Manuelli, Dieter Fox1 作者单位&#xff1a;University of Washington, NVIDIA 论文原文&#xff1a;https://arxiv.org/abs/2109.12098 论文出处…

安装opencart

一、安装模板 Install SO Emarket Opencart 4 Theme 一&#xff1a;so_emarket_quick2 二&#xff1a;theme package installation 1、installed opencart Default 2、Extensions->Installer->Upload->so_emarket_theme_oc4011_home21_to_home35_v2.0.3->so_theme…

奶茶点餐|奶茶店自助点餐系统|基于微信小程序的饮品点单系统的设计与实现(源码+数据库+文档)

奶茶店自助点餐系统目录 目录 基于微信小程序的饮品点单系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、商品信息管理 2、商品评价管理 3、商品订单管理 4、用户管理 四、数据库设计 1、实体ER图 2、具体的表设计如下所示&#xff1a; 五、核心代码 …

CSS Selector—选择方法,和html自动——异步社区的爬取(动态网页)——爬虫(get和post的区别)

这里先说一下GET请求和POST请求&#xff1a; post我们平时是要加data的也就是信息&#xff0c;你会发现我们平时百度之类的 搜索都是post请求 get我们带的是params&#xff0c;是发送我们指定的内容。 要注意是get和post请求&#xff01;&#xff01;&#xff01; 先说一下异…

跟着cherno手搓游戏引擎【24】开启2D引擎前的项目总结(包括前置知识汇总)

前置技术&#xff1a; vs属性解释&#xff1a; MSBuild的入门完整教程&#xff08;包学包会&#xff09;-CSDN博客 配置界面&#xff1a; c动态链接和静态链接&#xff1a; 隐藏的细节&#xff1a;编译与链接_哔哩哔哩_bilibili 【底层】动态链接库(dll)是如何工作的&…

基于微信小程序的在线课堂的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

FTP服务简介(工作原理、连接模式、流行服务器软件)

FTP&#xff08;File Transfer Protocol&#xff0c;文件传输服务&#xff09;提供在Internet上的任意两台计算机之间相互进行的文件传输。只要双方主机都支持FTP协议&#xff0c;就可以利用FTP来进行文件传输。 工作原理 FTP服务是客户/服务器模式&#xff0c;用户通过客户机…

[C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表

什么是ScottPlot.WPF&#xff1f; ScottPlot.WPF 是一个开源的数据可视化库&#xff0c;用于在 WPF 应用程序中创建高品质的绘图和图表。它是基于 ScottPlot 库的 WPF 版本&#xff0c;提供了简单易用的 API&#xff0c;使开发人员能够通过简单的代码创建各种类型的图表&#…