C++编程:进阶阶段—4.1封装

 C++面向对象的三大特性:封装、继承、多态

具有相同性质的对象,抽象为类

4.1 封装

封装的意义:将属性和行为作为一个整体,表现生活中的事物,并将属性和行为加以权限控制。

4.1.1 类的定义及实例化对象

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

类中的属性和行为统称为成员,属性也可以称为成员属性或成员变量,行为也可以称为成员函数或成员方法。

代码如下:

#include <iostream>
using namespace std;

//设计一个圆类,求圆的周长
const double PI=3.14;

//class代表设计一个类,类后面紧跟的是类名称
class Circle
{
    //访问权限
public://公共权限

    //属性
    //半径
    int r;

    //行为:获取圆的周长
    double calculateZC()
    {
        return 2*PI*r;
    }

};

int main()
{
    //实例化:通过圆类,创建具体的圆(对象)
    Circle c1;

    //给圆对象的属性进行赋值
    c1.r=10;
    cout<<"圆的周长为:"<<c1.calculateZC()<<endl;
    return 0;
}

输出如下:

4.1.2 访问权限

访问权限分为三种:

  • 公共权限:类内外都可以访问成员
  • 保护权限:类内可以访问成员,类外不能访问
  • 私有权限:类内可以访问成员,类外不能访问

代码如下:

#include <iostream>
using namespace std;

class Person
{
    //公共权限
public:
    string name;

    //保护权限
protected:
    string car;
    //私有权限
private:
    int passwd;
public:
    void func()
    {
        name="ddd";
        car="bench";
        passwd=4444;
    }
};
int main()
{
    //实例化一个对象
    Person p1;
    //给圆对象的属性进行赋值
    p1.name="dddd";
    //p1.car="paosij";
    //p1.passwd=1234;
    
    return 0;
}

错误示例:修改保护权限和私钥权限的属性。

成员属性设置为私有,可以自己控制读写权限,对于写权限,可以检测数据的有效性。

代码如下:

#include <iostream>
using namespace std;

class Person
{
public:
    //设置姓名
    void setName(string name)
    {
        m_name=name;
    }

    //获取姓名
    string getName()
    {
        return m_name;
    }

    //获取年龄
    int getAge()
    {
        return m_age;
    }

    //设置偶像
    void setIdol(string idol)
    {
        m_idol=idol;
    }

private:
    string m_name;//姓名 可读可写

    int m_age=18;//年龄 只读

    string m_idol;//偶像 只写


};
int main()
{
    //实例化一个对象
    Person p;
    //设置姓名
    p.setName("ddd");
    //获取姓名
    cout<<"姓名:"<<p.getName()<<endl;

    //设置年龄,不存在该函数
    //p.setAge("ddd");//报错 不存在该成员setAge
    //p.m_age=23;//报错 无法访问
    //获取年龄
    cout<<"年龄:"<<p.getAge()<<endl;

    //设置偶像
    p.setIdol("huge");
    //获取偶像,没有获取函数
    //cout<<"偶像:"<<p.getIdol()<<endl;//报错 不存在该成员getIdol
    //cout<<"偶像:"<<p.m_idol()<<endl;//报错 无法访问

    return 0;
}

错误示例:

4.1.3 struct 与 class

  • struct默认权限为公共
  • class默认权限为私有

错误示例:访问class中默认权限下的成员。

4.1.4 案例1:立方体类

题目:设计立方体类,求出立方体的面积和体积,分别用全局函数和成员函数判断两个立方体是否相等

代码如下:

#include <iostream>
using namespace std;

class Cube
{
private:
    //属性:长宽高
    int l;
    int w;
    int h;

public:
    //设置\获取属性
    void setLong(int ll)
    {
        l=ll;
    }

    int getLong()
    {
        return l;
    }

    void setWidth(int ww)
    {
        w=ww;
    }

    int getWidth()
    {
        return w;
    }

    void setHeight(int hh)
    {
        h=hh;
    }

    int getHeight()
    {
        return h;
    }
    //方法:计算面积、体积、判断两个立方体是否相等
    int getSquare()
    {
        return 2*(l*h+h*w+h*w);
    }

    int getVolume()
    {
        return l*w*h;
    }

    //利用成员函数判断两个立方体是否相等
    void isEqual(Cube &c)
    {
        if(l==c.getLong() && w==c.getWidth() && h==c.getHeight())
        {
            cout<<"两个立方体相同"<<endl;
        }
        else
        {
            cout<<"两个立方体不同"<<endl;
        }
    }
};

//利用全局函数判断两个立方体是否相等
void isSame(Cube &c1,Cube &c2)
{
    if(c1.getLong()==c2.getLong() && c1.getWidth()==c2.getWidth() && c1.getHeight()==c2.getHeight())
    {
        cout<<"两个立方体相同"<<endl;
    }
    else
    {
        cout<<"两个立方体不同"<<endl;
    }
}

int main()
{
    //创建对象
    Cube c1;
    c1.setLong(1);
    c1.setWidth(2);
    c1.setHeight(3);

    cout<<"c1的面积为:"<<c1.getSquare()<<endl;
    cout<<"c1的体积为:"<<c1.getVolume()<<endl;

    Cube c2;
    c2.setLong(1);
    c2.setWidth(2);
    c2.setHeight(3);

    //判断两个立方体是否相等
    isSame(c1,c2);
    c1.isEqual(c2);

    c2.setLong(2);
    isSame(c1,c2);
    c1.isEqual(c2);

    return 0;
}

输出如下:

4.1.5 案例2:点和圆(分文件)

题目:设计一个圆形类和一个点类,计算点和圆的关系。

代码如下:

#include <iostream>
using namespace std;

//点类
class Point
{
private:
    int p_x;
    int p_y;

public:
    //设置/获取X,Y
    void setX(int x)
    {
        p_x=x;
    }
    int getX()
    {
        return p_x;
    }

    void setY(int y)
    {
        p_y=y;
    }
    int getY()
    {
        return p_y;
    }
};

//圆类
class Circle
{
private:    
    int c_r;//半径
    Point center;//圆心

public:
    //设置/获取半径圆心
    void setR(int r)
    {
        c_r=r;
    }
    int getR()
    {
        return c_r;
    }

    void setCer(Point cer)
    {
        center=cer;
    }

    Point getCer()
    {
        return center;
    }
};

//判断点和圆的关系
void isInCircle(Circle &c,Point &p)
{
    int dist=(c.getCer().getX()-p.getX()) * (c.getCer().getX()-p.getX())+
    (c.getCer().getY()-p.getY()) * (c.getCer().getY()-p.getY());
    int rdist=c.getR() * c.getR();

    if(dist==rdist)
    {
        cout<<"点在圆上"<<endl;
    }
    else if(dist>rdist)
    {
        cout<<"点在圆外"<<endl;
    }
    else
    {
        cout<<"点在圆内"<<endl;
    }
}

int main()
{
    //创建点对象和圆对象
    Point p;
    Circle c;
    Point center;

    //设置点的坐标
    p.setX(0);
    p.setY(0);

    //设置园的半径及圆心的坐标
    c.setR(10);
    center.setX(10);
    center.setY(0);
    c.setCer(center);

    //判断点与圆的关系
    isInCircle(c,p);
    return 0;
}

输出如下:

分文件编写:

point.h

#pragma once//防止头文件重复包含
#include <iostream>
using namespace std;

//点类
class Point
{
private:
    int p_x;
    int p_y;

public:
    //设置/获取X,Y
    void setX(int x);

    int getX();

    void setY(int y);

    int getY();

};

point.cpp

#include "point.h"

//点类

//设置/获取X,Y
void Point::setX(int x)//Point::的作用是声明该函数是Point作用域下的成员函数
{
    p_x=x;
}
int Point::getX()
{
    return p_x;
}

void Point::setY(int y)
{
    p_y=y;
}
int Point::getY()
{
    return p_y;
}

circle.h

#pragma once
#include <iostream>
using namespace std;
#include "point.h"

//圆类
class Circle
{
private:    
    int c_r;//半径
    Point center;//圆心

public:
    //设置/获取半径圆心
    void setR(int r);

    int getR();

    void setCer(Point cer);

    Point getCer();

};

circle.cpp

#include "circle.h"

//圆类


//设置/获取半径圆心
void Circle::setR(int r)
{
    c_r=r;
}
int Circle::getR()
{
    return c_r;
}

void Circle::setCer(Point cer)
{
    center=cer;
}

Point Circle::getCer()
{
    return center;
}

main.cpp

#include <iostream>
using namespace std;
#include "point.h"
#include "circle.h"


//判断点和圆的关系
void isInCircle(Circle &c,Point &p)
{
    int dist=(c.getCer().getX()-p.getX()) * (c.getCer().getX()-p.getX())+
    (c.getCer().getY()-p.getY()) * (c.getCer().getY()-p.getY());
    int rdist=c.getR() * c.getR();

    if(dist==rdist)
    {
        cout<<"点在圆上"<<endl;
    }
    else if(dist>rdist)
    {
        cout<<"点在圆外"<<endl;
    }
    else
    {
        cout<<"点在圆内"<<endl;
    }
}

int main()
{
    //创建点对象和圆对象
    Point p;
    Circle c;
    Point center;

    //设置点的坐标
    p.setX(0);
    p.setY(0);

    //设置园的半径及圆心的坐标
    c.setR(10);
    center.setX(10);
    center.setY(0);
    c.setCer(center);

    //判断点与圆的关系
    isInCircle(c,p);
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/982588.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信奥赛CSP-J复赛集训(模拟算法专题)(1):P8813 [CSP-J 2022] 乘方

信奥赛CSP-J复赛集训&#xff08;模拟算法专题&#xff09;&#xff08;1&#xff09;&#xff1a;P8813 [CSP-J 2022] 乘方 题目描述 小文同学刚刚接触了信息学竞赛&#xff0c;有一天她遇到了这样一个题&#xff1a;给定正整数 a a a 和 b b b&#xff0c;求 a b a^b ab …

Flink深入浅出之02

深入浅出Flink-第二天 目标 掌握常见的DataStream常见的source掌握常见的DataStream的transformation操作掌握常见的DataStream的sink操作了解入门的DataSet API算子 &#x1f4d6; 1. DataStream 的编程模型 DataStream 的编程模型包括四个部分&#xff1a;Environment、D…

[C语言日寄] 字符串操作函数的使用及其拓展

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

基于websocket的多用户网页五子棋 --- 测试报告

目录 功能测试自动化测试性能测试 功能测试 1.登录注册页面 2.游戏大厅页面 3.游戏房间页面 自动化测试 1.使用脑图编写web自动化测试用例 2.创建自动化项目&#xff0c;根据用例通过selenium来实现脚本 根据脑图进行测试用例的编写&#xff1a; 每个页面一个测试类&am…

【Linux】信号处理以及补充知识

目录 一、信号被处理的时机&#xff1a; 1、理解&#xff1a; 2、内核态与用户态&#xff1a; 1、概念&#xff1a; 2、重谈地址空间&#xff1a; 3、处理时机&#xff1a; 补充知识&#xff1a; 1、sigaction&#xff1a; 2、函数重入&#xff1a; 3、volatile&…

(三) 征服MySQL面试:30+高频核心问题深度剖析与实战指南

一、为什么MySQL是面试的"必答题"&#xff1f; 数据库领域占比&#xff1a;MySQL占据全球关系型数据库市场份额Top 3&#xff0c;阿里、腾讯、美团等大厂核心系统深度依赖技术栈深度检验&#xff1a;通过MySQL问题可考察候选人的数据结构理解、系统设计能力、性能优…

TensorFlow深度学习实战(10)——迁移学习详解

TensorFlow深度学习实战(10)——迁移学习详解 0. 前言1. 迁移学习1.1 迁移学习基本概念1.2 迁移学习的重要性1.3 ImageNet1.4 迁移学习流程2. Inception V3 架构3. 构建迁移学习模型小结系列链接0. 前言 迁移学习( Transfer Learning )是一种利用从一项任务中获得的知识来解…

Docker基础篇——什么是Docker与Docker的仓库、镜像、容器三大概念

大家好我是木木&#xff0c;在当今快速发展的云计算与云原生时代&#xff0c;容器化技术蓬勃兴起&#xff0c;Docker 作为实现容器化的主流工具之一&#xff0c;为开发者和运维人员带来了极大的便捷 。下面我们一起了解下什么是Docker与与Docker的仓库、镜像、容器三大概念。 …

蓝桥杯题型

蓝桥杯题型分类 二分 123 传送门 1. 小区间的构成 假设数列的构成是如下形式&#xff1a; 第 1 个区间包含 1 个元素&#xff08;1&#xff09;。第 2 个区间包含 2 个元素&#xff08;1 2&#xff09;。第 3 个区间包含 3 个元素&#xff08;1 2 3&#xff09;。第 4 个区…

大模型AI平台DeepSeek 眼中的SQL2API平台:QuickAPI、dbapi 和 Magic API 介绍与对比

目录 1 QuickAPI 介绍 2 dbapi 介绍 3 Magic API 介绍 4 简单对比 5 总结 统一数据服务平台是一种低代码的方式&#xff0c;实现一般是通过SQL能直接生成数据API&#xff0c;同时能对产生的数据API进行全生命周期的管理&#xff0c;典型的SQL2API的实现模式。 以下是针对…

本地部署pangolin获取谱系,从而达到预测新冠的流行趋势

步骤 1&#xff1a;安装Docker 注&#xff1a;此步骤忽略&#xff0c;可通过Docker官网对于文档进行安装,地址如下 Docker: Accelerated Container Application Developmenthttps://www.docker.com/ 步骤 2&#xff1a;拉取Pangolin镜像 docker pull staphb/pangolin:latest 步…

HarmonyOS Next 属性动画和转场动画

HarmonyOS Next 属性动画和转场动画 在鸿蒙应用开发中&#xff0c;动画是提升用户体验的关键要素。通过巧妙运用动画&#xff0c;我们能让应用界面更加生动、交互更加流畅&#xff0c;从而吸引用户的注意力并增强其使用粘性。鸿蒙系统为开发者提供了丰富且强大的动画开发能力&…

K8S学习之基础十:k8s中初始化容器和主容器

init容器和主容器 init容器和主容器的区别 初始化容器不支持 Readinessprobe&#xff0c;因为他们必须在pod就绪之前运行完成每个init容器必须运行成功&#xff0c;下一个才能够运行 # 定义两个初始化容器&#xff0c;完成后再运行主容器 vi pod-init.yaml apiVersion: v1 …

PostgreSQL 安装与使用

下载地址: EDB: Open-Source, Enterprise Postgres Database Management 安装图形化安装界面安装。安装完后将bin目录配置到系统环境变量 执行psql -h localhost -p 5432 -U postgres 密码在安装过程中设置的 ​ 0、修改密码 ALTER USER sonar WITH PASSWORD 123456; 1、新…

WPF高级 | WPF 应用程序部署与发布:确保顺利交付到用户手中

WPF高级 | WPF 应用程序部署与发布&#xff1a;确保顺利交付到用户手中 一、前言二、部署与发布基础概念2.1 部署的定义与目的2.2 发布的方式与渠道2.3 部署与发布的关键要素 三、WPF 应用程序打包3.1 使用 Visual Studio 自带的打包工具3.2 使用第三方打包工具 四、发布到不同…

Mybatis 的关联映射(一对一,一对多,多对多)

前言 在前面我们已经了解了&#xff0c;mybatis 的基本用法&#xff0c;动态SQL&#xff0c;学会使用mybatis 来操作数据库。但这些主要操作还是针对 单表实现的。在实际的开发中&#xff0c;对数据库的操作&#xff0c;常常涉及多张表。 因此本篇博客的目标&#xff1a;通过my…

在Linux中开发OpenGL——检查开发环境对OpenGL ES的支持

由于移动端GPU规模有限&#xff0c;厂商并没有实现完整的OpenGL特性&#xff0c;而是实现了它的子集——OpenGL ES。因此如果需要开发的程序要支持移动端平台&#xff0c;最好使用OpenGL ES开发。 1、 下载支持库、OpenGL ES Demo 1.1、下载PowerVRSDK支持库作为准备&#xff…

【Python项目】基于深度学习的电影评论情感分析系统

【Python项目】基于深度学习的电影评论情感分析系统 技术简介&#xff1a;采用Python技术、Flask框架、MySQL数据库、Word2Vec模型等实现。 系统简介&#xff1a;该系统基于深度学习技术&#xff0c;特别是Word2Vec模型&#xff0c;用于分析电影评论的情感倾向。系统分为前台…

SLAM评估工具安装及使用EVO(Ubuntu20.04安装evo)--缺少 onnx 库还有Pandas 版本不兼容解决

介绍一下我的是ubuntu20.04.机载电脑是orinnx&#xff0c;通过源码烧写的系统。 首先打开终端&#xff0c;输入 pip install evo --upgrade --no-binary evo 安装过程中出现如下问题 缺少 onnx 库还有Pandas 版本不兼容&#xff0c; ONNX&#xff08;Open Neural Network E…

Arcgis中添加脚本工具箱

文章目录 准备资料1、打开arcmap2、找到目录窗口3、复制粘贴工具箱的路径4、添加或者确认python脚本路径准备资料 (1)工具箱 (2)python脚本 1、打开arcmap 2、找到目录窗口 3、复制粘贴工具箱的路径 4、添加或者确认python脚本路径 脚本上右键属性(注意:脚本内容和路径…