5. 类和对象

news2024/12/21 18:48:58

一、面向对象程序设计的基本特点

1.1 抽象

  • 指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程

  • 数据抽象

    • 描述某类对象的属性或状态,即此类对象与其他类对象的区别
  • 行为抽象

    • 描述某类对象的共同行为或功能特征

      以人为例,对其进行抽象。
      共同属性:姓名、性别、年龄等等,则数据抽象:

      string name, string sex, int age

      共同的行为:吃饭、走路、学习等等,则行为抽象:

      eat(), walk(), study()

1.2 C++面向对象三大特性

  1. 封装将数据和操作数据的函数代码进行有机结合,形成 “ 类 ”,其中的数据和函数都是类的成员
  2. 继承:允许在保存原有类特性的基础上,进行更具体、更详细的说明
  3. 多态:一段程序能处理多种类型对象的能力

二、类和对象的基本概念

2.1 封装

  1. 目的:

  2. 增强安全性和简化编程,使用者不需要具体了解实现细节,只需要通过外部接口,以特定的权限进行访问,使用类的成员

  3. 意义:

    1. 将属性和行为作为一个整体
    2. 将属性和行为加以权限控制
  4. 语法:

    class ClassName {
        访问权限:
            属性
            行为
    }
    

2.2 类和对象

  • 类(class)
    • 对逻辑上相关的函数和数据的封装,是对问题的抽象描述
    • 在面向对象程序设计中,程序模块是由类构成的
  • 对象(object)
    • 是具有类类型的变量
    • C++认为万事万物皆为对象对象具有属性行为
    • 具有相同性质的对象,可以抽象为类
      • 例如,人属于人类,人作为对象,属性包括姓名、性别、年龄等,行为包括吃饭、走路、学习等
      • 类中的属性和行为,统称为成员
        • 属性:成员属性,成员变量
        • 行为:成员函数,成员方法

2.3 类的定义

2.3.1 语法

// 类名称通常将首字母写成大写
class 类名{
public:
    公有成员(外部接口) // 任何外部函数都可访问
private:
    私有成员		   // 只允许本类中的函数访问
protected:
    保护型成员		  // 与继承有关
}

// 实例化一个对象
类名	对象名;

// 访问数据成员
对象名.数据成员名

// 调用函数成员
对象名.函数成员名(参数表)

示例:

image-20220605003216489
// 封装一个圆类,求圆的面积和周长
class Circle{
public:
    // 属性:半径
    int radius;
    // 行为:获取圆面积;获取圆周长
    double findArea();
    double findPerimeter();
};

int main(){
    Circle c;
    c.radius = 10;
    
    std::cout << "圆的面积:" << c.findArea() << std::endl;
    std::cout << "圆的周长:" << c.findPerimeter() << std::endl;
}

2.3.2 成员访问权限

  • public、protected和private是访问权限修饰符
    • 被public修饰的属性和函数可以在类内部与类外部被访问
    • 被protected和private修饰的属性和函数只能在类内部被访问
  • 成员函数可以访问本类中任何成员。一般的做法是将需要被外界调用的成员函数指定为public,他们是类的对外接口
  • 有的函数并不是准备为外界调用的,而是为本类中的成员函数所调用的,就应该将它们指定为private
  • 一般将属性定义为私有,行为定义为公有
  • struct和class的区别:默认的访问权限不同
    • struct 默认权限为公共
    • class 默认权限为私有

示例:

class Clock{
public:
    void setTime(int newH, int newM, int newS);
    void showTime();
private:
    int hour, minute, second;    
}

2.3.3 类的成员函数

  • 描述类的行为,对封装的数据进行操作的方法

  • 函数的原型声明要写在类体中,函数的具体实现写在类定义外

  • 类成员函数的默认值,一定要写在类定义中

  • 语法:

    返回值类型	类名::函数成员名(参数表){
        
        函数体
    
    }
    

    示例:

    #include <iostream>
    using namespace std;
    class Clock {
    public:
        void setTime(int newH = 0, int newM = 0, int newS = 0);
        void showTime();
    private:
        int hour, minute, second;    
    };
    
    // 类成员函数setTime
    void Clock::setTime(int newH, int newM, int newS) {
        hour = newH;
        minute = newM;
        second = newS;
    }
    // 类成员函数showTime
    void Clock::showTime() {
        cout << hour << ":" << minute << ":" << second;
    }
    
    int main() {
        Clock myClock;	// 定义对象
        myClock.setTime(8, 30, 30);	// 通过“.”操作符实现对象成员函数的访问
        myClock.showTime();
        return 0;
    }
    

2.4 多文件编写代码

2.4.1 多文件结构

通常一个项目至少划分为3个文件:

  • 类定义文件(*.h文件)
    • 写类的声明,包括了所有函数的函数头
  • 类实现文件(*.cpp文件)
    • 写类的定义
    • 注意要引用类定义文件,#include *.h
    • 定义成员函数时函数名称前要加上类名:类名::函数,例如:Clock::setTime
  • 类使用文件(*.cpp,主函数文件)
    • 创建类对象并进行调用
    • 注意要引用类定义文件,#include *.h

更为复杂的程序,可以将每一个类都用单独的定义和实现文件

image-20220607093523738

2.4.2 例子:点和圆的关系

image-20230509102226707
  • 所有代码在同一个源文件内

    # include <iostream>
    using namespace std;
    
    class Point { //点类
    public:
        void setX(int x) { m_X = x; } //设置x
        int getX() { return m_X; }    //获取x
        void setY(int y) { m_Y = y; } //设置y
        int getY() { return m_Y; }    //获取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);
    }
    
  • 多文件编写

    • 点类头文件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;       
      };
      
    • 点类源文件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; 
      }    
      
    • 圆类头文件circle.h(写圆类的类声明)

      # pragma once
      # include <iostream>
      using namespace std;
      
      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;  //圆心      
      };
      
    • 圆类源文件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;
      }
      
    • 主函数main.cpp(调用类)

      # include <iostream>
      # include "circle.h"
      # include "point.h"
      using namespace std;
      
      //判断点和圆的关系
      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);
      }
      

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

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

相关文章

计算机毕业论文内容参考|基于神经网络的网络安全态势感知技术研究

文章目录 导文文章重点摘要前言绪论课题背景国内外现状与趋势课题内容相关技术与方法介绍技术分析技术设计技术实现总结与展望导文 基于神经网络的网络安全态势感知技术研究 文章重点 摘要 随着互联网的快速发展,网络攻击的频率和复杂度也在逐年增加。为了更好地保护信息系统…

Java版本spring cloud 工程管理系统软件 系统源代码 自主研发,工程行业适用

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

项目终于用上了 DDD 领域驱动,太强了

在公司对支付业务、结算业务、资金业务使用DDD进行领域建模的两年&#xff0c;得到了许多好评&#xff0c;也面对过不少质疑&#xff0c;总体来说还是能收获不少&#xff0c;这对团队成员理解业务起着很大作用。近半年一直在研究DDD的落地实战&#xff0c;如今已修得阶段性成果…

让ChatGPT来制作Excel表格,ChatGPT实现文本和表格的相互转换

Office 三套件可以说是现代办公族必备的办公工具。其中&#xff0c;Excel 因为内置的计算函数、VBA 宏等高级功能又成为了非专业人士最头疼的 Office 组件。非财务专业人士&#xff0c;估计平常会用的 Excel 函数仅限于 SUM(), AVERAGE() 等&#xff0c;甚至这些都是通过界面点…

【2023 · CANN训练营第一季】应用开发深入讲解——第三章应用调试

学习资源 日志参考文档 应用开发FAQ 日志主要用于记录系统的运行过程及异常信息&#xff0c;帮助快速定位系统运行过程中出现的问题以及开发过程中的程序调试问题。 日志分为如下两大类&#xff1a; 系统类日志&#xff1a;系统运行产生的日志。主要包括&#xff1a; Contro…

shiro CVE-2016-4437 漏洞复现

shiro Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序漏洞原理 在Apache shiro的框架中&#xff0c;执行身份验证时提供了…

【开发者必读】如何在MyEclipse中使用内联搜索?

MyEclipse v2022.1.0正式版下载 DevStyle中的内联搜索取代了传统的Eclipse查找和替换对话框&#xff0c;提供了一种更加高效和非侵入性的搜索体验——一种不会中断您的开发工作流程的工具。 DevStyle是一个Eclipse插件&#xff0c;也包含在MyEclipse中。 选择内联搜索参数 …

C++编译器对于对象的优化

C编译器对于对象构造的优化 用临时对象生成新对象时&#xff0c; 临时对象就不产生了&#xff0c;直接构造新对象即可 class Test { public:Test(int a 10) :ma(a){cout << "Test(int)" << endl;}~Test(){cout << "~Test()" <<…

node中npm依赖安装顺序,package-lock.json文件详解

前置知识&#xff1a;需要先了解package.json 和package-lock.json的基本知识和使用方法&#xff0c;可以参考这篇文章。 npm依赖安装的逻辑和顺序可以参考这篇文章 理论看完了我们来看一下实际项目中的是啥样的&#xff0c;上面文章所讲的逻辑都会在npm install之后&#xf…

程序员面试金典16.*

文章目录 16.01 交换数字16.02单词频率16.03交点16.04 井字游戏16.05 阶乘尾数16.06 最小差16.07 最大数值16.08 整数的英文表示16.09 运算16.10 生存人数16.11 跳水板16.13 平分正方形16.14 最佳直线&#xff08;待定&#xff09;16.15珠玑妙算16.16部分排序16.17连续数列16.1…

Hadoop HDFS的API操作

客户端环境准备 hadoop的 Windows依赖文件夹&#xff0c;拷贝hadoop-3.1.0到非中文路径&#xff08;比如d:\&#xff09;。 配置HADOOP_HOME环境变量 配置Path环境变量。 不能放在包含有空格的目录下&#xff0c;cmd 输入hadoop显示此时不应有 \hadoop-3.0.0\bin\。我放在…

关于linux中防火墙的命令

文章目录 一、linux 6.5 下二、linux 7.0 下 (CentOs7.3)常用命令 三、关于端口的一些命令四、一些状况 linux不同版本防火墙是不同的&#xff0c;命令如下 一、linux 6.5 下 service iptables status ## 查看防火墙状态 service iptables start ## 开启防火墙 service iptab…

谁还在AI焦虑?

时至今日&#xff0c;人们对GPT 为首的诸多AI&#xff0c; 大有热情消退的迹象。 与2个月前相比&#xff0c;简直恍如隔世。 这也进步一部印证了“山洞隐喻” 人类始终对未知充满恐惧和焦虑。 曾经人们忧心忡忡&#xff0c;整天讨论AI&#xff0c; 取代人类工作之后&…

如何用ChatGPT做新品上市推广方案策划?

该场景对应的关键词库(28个&#xff09;&#xff1a; 品牌、产品信息、新品、成分、属性、功效、人群特征、客户分析、产品定位、核心卖点、推广策略、广告、公关、线上推广、线下活动、合作伙伴、资源整合、预算、执行计划、监测、评估、微调方案、价值主张、营销策略、热点话…

第四十七章 Unity 布局(中)

在上一章节中我给父元素Panel添加了Horizontal Layout Group组件&#xff0c;并且添加了两个Text元素。 我们发现两个Text UI 元素在水平方向上面依次放置在Panel的最上面。由于Panel的宽度为300&#xff0c;而两个Text的总宽度为 160 160 320&#xff0c;因此两个Text 超出了…

C++入门知识(下)

目录 一、内联函数 1.1内联函数的概念 1.2内联函数的使用 1.3内联函数的特性 1.4宏的优缺点 1.5C中可替代宏的技术 二、auto关键字 2.1什么是auto关键字 2.2auto简介 2.3auto的使用细则 2.4auto不能推导的场景 三、基于范围的for循环&#xff08;C11&#xff09; 3.…

大屏只用来做汇报?知道这6个应用场景,直接升职加薪!

五一假几个朋友小聚了一下&#xff0c;好久没联系了&#xff0c;现在才知道大家从事行业五花八门的。知道我从事IT行业好几年&#xff0c;他们非要让我讲讲现在异常火爆的大屏&#xff0c;说是所在企业单位都在研究这玩意儿&#xff0c;有的业务人员焦虑不已不知道如何下手&…

Lenovo m93 mini 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板Lenovo m93 mini 处理器Intel i5-4590T 2.20GHz (35w) 4-core/4-thread已驱动 内存8GB (2x4) DDR3 1600MHz已驱动 硬盘2.5" SSD Samsung 8…

《Linux 内核设计与实现》11. 定时器和时间管理

文章目录 内核中时间的概念节拍率&#xff1a;HZ理想的 HZ 值高 HZ 的优势高 HZ 的劣势 jiffiesjiffies 的内部表示jiffies 的回绕用户空间和 HZ 硬时钟和定时器实时时钟系统定时器 时钟中断处理程序实际时间定时器使用定时器定时器竞争条件实现定时器 延迟执行忙等待短延迟sch…

跨境商城APP开发需要注意的问题

随着全球化的趋势&#xff0c;跨境电商发展迅猛&#xff0c;越来越多的企业开始进军跨境市场。而跨境商城APP已经成为跨境电商非常重要的一部分。在开发跨境商城APP时&#xff0c;需要注意以下问题&#xff1a; 1.多语言支持 跨境商城APP需要支持不同国家和地区的语言&#x…