第十二章 类和对象

news2024/12/26 22:09:55

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

C++认为万事万物都皆为对象,对象上有其属性和行为

例如:

人可以作为对象,属性有姓名、年龄、身高、体重...,行为有走、跑、跳、吃饭、唱歌...

车也可以作为对象,属性有轮胎、方向盘、车灯...,行为有载人、放音乐、放空调...

具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类

一、封装

1、封装的意义

封装是C++面向对象三大特性之一

封装的意义:

  • 将属性和行为作为一个整体,表现生活中的事物

  • 将属性和行为加以权限控制

封装意义一:

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

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

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

示例代码:

 //圆周率
 const double PI = 3.14;
 ​
 //1、封装的意义
 //将属性和行为作为一个整体,用来表现生活中的事物
 ​
 //封装一个圆类,求圆的周长
 //class代表设计一个类,后面跟着的是类名
 class Circle
 {
 public:  //访问权限  公共的权限
 ​
     //属性
     int m_r;//半径
 ​
     //行为
     //获取到圆的周长
     double calculateZC()
     {
         //2 * pi  * r
         //获取圆的周长
         return  2 * PI * m_r;
     }
 };
 ​
 int main() {
 ​
     //通过圆类,创建圆的对象
     // c1就是一个具体的圆
     Circle c1;
     c1.m_r = 10; //给圆对象的半径 进行赋值操作
 ​
     //2 * pi * 10 = = 62.8
     cout << "圆的周长为: " << c1.calculateZC() << endl;
 ​
     system("pause");
 ​
     return 0;
 }

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

示例2代码:  ​

 //学生类
 class Student {
 public:
     void setName(string name) {
         m_name = name;
     }
     void setID(int id) {
         m_id = id;
     }
 ​
     void showStudent() {
         cout << "name:" << m_name << " ID:" << m_id << endl;
     }
 public:
     string m_name;
     int m_id;
 };
 ​
 int main() {
 ​
     Student stu;
     stu.setName("德玛西亚");
     stu.setID(250);
     stu.showStudent();
 ​
     system("pause");
 ​
     return 0;
 }

封装意义二:

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

访问权限有三种:

  1. public 公共权限

  2. protected 保护权限

  3. private 私有权限

示例:

 //三种权限
 //公共权限  public     类内可以访问  类外可以访问
 //保护权限  protected  类内可以访问  类外不可以访问
 //私有权限  private    类内可以访问  类外不可以访问
 ​
 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 p;
     p.m_Name = "李四";
     //p.m_Car = "奔驰";  //保护权限类外访问不到
     //p.m_Password = 123; //私有权限类外访问不到
 ​
     system("pause");
 ​
     return 0;
 }

2、struct和class区别

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

区别:

  • struct 默认权限为公共

  • class 默认权限为私有

 class C1
 {
     int  m_A; //默认是私有权限
 };
 ​
 struct C2
 {
     int m_A;  //默认是公共权限
 };
 ​
 int main() {
 ​
     C1 c1;
     c1.m_A = 10; //错误,访问权限是私有
 ​
     C2 c2;
     c2.m_A = 10; //正确,访问权限是公共
 ​
     system("pause");
 ​
     return 0;
 }

3、成员属性设置为私有

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

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

示例:

 class Person {
 public:
 ​
     //姓名设置可读可写
     void setName(string name) {
         m_Name = name;
     }
     string getName()
     {
         return m_Name;
     }
 ​
 ​
     //获取年龄 
     int getAge() {
         return m_Age;
     }
     //设置年龄
     void setAge(int age) {
         if (age < 0 || age > 150) {
             cout << "你个老妖精!" << endl;
             return;
         }
         m_Age = age;
     }
 ​
     //情人设置为只写
     void setLover(string lover) {
         m_Lover = lover;
     }
 ​
 private:
     string m_Name; //可读可写  姓名
     
     int m_Age; //只读  年龄
 ​
     string m_Lover; //只写  情人
 };
 ​
 ​
 int main() {
 ​
     Person p;
     //姓名设置
     p.setName("张三");
     cout << "姓名: " << p.getName() << endl;
 ​
     //年龄设置
     p.setAge(50);
     cout << "年龄: " << p.getAge() << endl;
 ​
     //情人设置
     p.setLover("苍井");
     //cout << "情人: " << p.m_Lover << endl;  //只写属性,不可以读取
 ​
     system("pause");
 ​
     return 0;
 }

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

设计立方体类(Cube)

求出立方体的面积和体积

分别用全局函数和成员函数判断两个立方体是否相等。

                ​​​​​​​        ​​​​​​​        ​​​​​​​        

#include<iostream>
using namespace std;

class Cube
{
    private:
        int m_l;
        int m_w;
        int m_h;
    public:
        // setter and getter
        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 getPerimeter()
        {
            return 2 * m_l * m_w + 2 * m_l * m_h + 2 * m_w * m_h;
        }

        // 获取体积
        int getVolume()
        {
            return m_l * m_w * m_h;
        }

        // 判断相等
        bool isSame(Cube &c)
        {
            return m_l == c.getL() && m_w == c.getW() && m_h == c.getH();
        }



};
bool isSame(Cube &c1, Cube &c2)
{
    return c1.getL() == c2.getL() && c1.getW() == c2.getW() && c1.getH() == c2.getH();
}
int main()
{
    // Cube c;
    // c.setL(10);
    // c.setW(10);
    // c.setH(10);

    // cout << "立方体周长:" << c.getPerimeter() << endl;
    // cout << "立方体体积:" << c.getVolume() << endl;

    // Cube c1, c2;
    // c1.setL(10);
    // c1.setW(10);
    // c1.setH(10);

    // c2.setL(10);
    // c2.setW(10);
    // c2.setH(10);
    // cout << (isSame(c1, c2) ? "相等":"不相等") << endl;

    Cube c1, c2;
    c1.setL(10);
    c1.setW(130);
    c1.setH(10);

    c2.setL(10);
    c2.setW(10);
    c2.setH(10);
    cout << (c1.isSame(c2) ? "相等":"不相等") << endl;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker安装apisix全教程包含windows和linux

docker安装apisix 一、Windows安装1、首先需要安装docker和docker compose&#xff0c;如果直接安装docker desktop&#xff0c;会自动安装docker compose。2、重新启动电脑3、访问 Docker 的下载&#xff08;[https://www.docker.com/products/docker-desktop](https://www.do…

RocketMQ 版本升级测试

一、背景 RocketMQ 版本升级&#xff0c;3.6.4升级到5.1.3。 二、机器资源 应用端&#xff1a; 10.XX.67.249【机器 1】 cd /home/product/logs/dolphin_task_test_logs/ vim info.logMQ 服务端&#xff1a; 旧MQ 10.XX.108.249 broker-001。用于测试升级NameServer【机器 2…

react库的基础学习

React介绍 React.js是前端三大新框架&#xff1a;Angular.js、React.js、Vue.js之一&#xff0c;这三大新框架的很多理念是相同的&#xff0c;但是也有各自的特点。 React起源于Facebook的内部项目&#xff0c;因为该公司对市场上所有 JavaScript MVC 框架&#xff0c;都不满…

【数据库】形式化关系查询语言(一):关系代数Relational Algebra

目录 一、关系代数Relational Algebra 1. 基本运算 a. 选择运算&#xff08;Select Operation&#xff09; b. 投影运算&#xff08;Project Operation&#xff09; 组合 c. 并运算&#xff08;Union Operation&#xff09; d. 集合差运算&#xff08;Set Difference Op…

【C++】vector基本接口介绍

vector接口目录&#xff1a; 一、vector的初步介绍 1.1vector和string的联系与不同 1.2 vector的源码参数 二、vector的四种构造&#xff08;缺省填充元素迭代器拷贝构造&#xff09; 三、vecto的扩容操作与机制 3.1resize&#xff08;老朋友了&#xff0c;不会就去看str…

Linux文件查找,别名,用户组综合练习

1.文件查看: 查看/etc/passwd文件的第5行 [rootserver ~]# head -5 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi…

epoll与socket缓冲区的恩恩怨怨

文章目录 前言一、什么是socket缓冲区二、阻塞与非阻塞内核缓冲区1、如果发送缓冲区满了会怎么样阻塞非阻塞 2、如果接受缓冲区为空会怎么样阻塞非阻塞 三、epoll与缓冲区的恩恩怨怨水平触发边缘触发非阻塞阻塞 结论 前言 本文深挖网络编程中的缓冲区&#xff0c;从什么是缓冲…

排序:基数排序算法分析

1.算法思想 假设长度为n的线性表中每个结点aj的关键字由d元组 ( k j d − 1 , k j d − 2 , k j d − 3 , . . . , k j 1 , k j 0 ) (k_{j}^{d-1},k_{j}^{d-2},k_{j}^{d-3},... ,k_{j}^{1} ,k_{j}^{0}) (kjd−1​,kjd−2​,kjd−3​,...,kj1​,kj0​)组成&#xff0c; 其中&am…

微信小程序开发基础(一)认识小程序

微信小程序&#xff0c;小程序的一种&#xff0c;英文名Wechat Mini Program&#xff0c;是一种不需要下载安装即可使用的应用&#xff0c;它实现了应用“触手可及”的梦想&#xff0c;用户扫一扫或搜一下即可打开应用。微信小程序是一种不用下载就能使用的应用&#xff0c;也是…

排序:外部排序算法分析

1.外存与内存之间的数据交换 1.外存&#xff08;磁盘&#xff09; 操作系统以“块”为单位对磁盘存储空间进行管理&#xff0c;如:每块大小1KB 各个磁盘块内存放着各种各样的数据。 2.内存 磁盘的读/写以“块”为单位数据读入内存后才能被修改修改完了还要写回磁盘。 2.外…

Purple-Pi-OH OHOS SDK编译手册

一、源码获取 1.1 源码获取 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 $ mkdir purple-pi #将下载的ido_purple_pi_oh_ohos3.2_sdk.tgz拷贝到purple-pi $ cd purple-pi $ md5sum ido_purple_pi_oh_ohos3.2_sdk.tgz e6ca2d96aa7c628992ae0bbf4d14c2ca …

面试买书复习就能进大厂?

大家好&#xff0c;我是苍何。 现在进大仓是越来越难了&#xff0c;想通过简单的刷题面试背书&#xff0c;比几年前难的不少&#xff0c; 但也并非毫无希望&#xff0c;那究竟该如何准备才能有希望进大厂呢&#xff1f; 我总结了 4 点&#xff1a; 1、不差的学历背景 2、丰富…

EcmaScript标准-导入与导出-js

ECMAScript是一种由Ecma国际&#xff08;前身为欧洲计算机制造商协会&#xff0c;European Computer Manufacturers Association&#xff09;通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛&#xff0c;它往往被称为JavaScript或JScript&#xff0c;所以它…

lwIP 开发指南(下)

目录 NETCONN 编程接口简介netbuf 数据缓冲区netconn 连接结构netconn 编程API 函数 NETCONN 编程接口UDP 实验NETCONN 实现UDPNETCONN 接口的UDP 实验硬件设计软件设计下载验证 NETCONN 接口编程TCP 客户端实验NETCONN 实现TCP 客户端连接步骤NETCONN 接口的TCPClient 实验硬件…

九、Delay函数

1、两个延时函数 vTaskDelay&#xff1a;至少等待指定个数的Tick Interrupt才能变为就绪态。vTaskDelayUntil&#xff1a;等待到指定的绝对时刻&#xff0c;才能变为就绪态。 2、函数原型 /* xTicksToDelay: 等待多少个Tick */ void vTaskDelay( const TickType_t xTicksToD…

1.(vue3.x+vite)封装组件

前端技术社区总目录(订阅之前请先查看该博客) 关联博客 2.(vue3.x+vite)组件注册并调用 1:创建组件目录package,并创建相关工程结构 2:编写组件内容(index.vue) 3:添加注册组件方法(index.js) 4:添加路由

QT按钮介绍

目录 按钮基类 QAbstractButton QPushButton QToolButton QRadioButton QCheckBox 按钮基类 QAbstractButton 这是按钮的基类&#xff0c;它是继承QWidget类 它可对当前的图标&#xff0c;标题等进行设置。 它有自己的一些信号与槽函数&#xff1a; /* 当按钮被激活时(即…

【C++的OpenCV】第十三课-OpenCV基础强化(一):绝对有用!Mat相关的一系列知识(基础->进阶)

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496;&#x1f496;&…

rhel8 网络操作学习

一、查询dns服务器地址汇总 1.查询dns服务器地址&#xff1a; &#xff08;1&#xff09;方法一&#xff1a;执行命令 cat /etc/resolv.conf 执行结果如下&#xff1a; nameserver后面就是dns服务器的ip地址。 &#xff08;2&#xff09;方法2&#xff1a;查看/etc/syscon…

Linux性能优化--性能工具-系统CPU

2.0.概述 本章概述了系统级的Linux性能工具。这些工具是你追踪性能问题时的第一道防线。 它们能展示整个系统的性能情况和哪些部分表现不好。 1.理解系统级性能的基本指标&#xff0c;包括CPU的使用情况。 2.明白哪些工具可以检索这些系统级性能指标。2.1CPU性能统计信息 为了…