基于C++的面向对象程序设计:类与对象的深入剖析

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

面向对象程序设计的基本特点包括:抽象、封装、继承、多态。

抽象

抽象是指对具体问题或对象进行概括,抽出其公共性质并加以描述的过程。一般情况抽象分为数据抽象和行为抽象,其中数据抽象是指一个对象区别于另一个对象的特征,行为抽象是指某类对象的共同特征。

封装

封装是指将抽象得到的数据和行为相结合,隐藏对象属性和实现细节且仅对外提供公共访问方式的过程。

继承

继承是指通过代码复用在保持原有类特性的基础上对子类进行具体说明的过程,通俗来说继承就是精简重复代码的手段。

多态

多态是指一段程序能够处理多种类型对象的能力,函数重载就是实现多态的一种手段。在 C++ 语言中多态可分为强制多态、重载多态、类型参数化多态和包含多态。

类是 C++ 语言支持面向对象思想的重要机制,是实现封装的基本单元类和对象是面向对象程序设计(OOP)的基本概念。在C++中,类是一种用户自定义的数据类型,它封装了数据成员和成员函数。对象是类的实例化,通过创建对象可以访问类的成员。

类的定义通常包括以下部分:

  1. 类名:用于标识类的名称。
  2. 数据成员:用于存储类的属性。
  3. 成员函数:用于操作类的属性。
  4. 访问控制符:用于控制类成员的访问权限,如public、protected和private。

对象的创建和使用如下:

  1. 声明对象:使用类名声明一个对象,例如ClassName objectName;
  2. 初始化对象:可以在声明对象时进行初始化,例如ClassName objectName(parameters);
  3. 访问对象成员:使用对象名和点运算符访问对象的成员,例如objectName.memberName;
类的定义

类一般由类名、数据成员、函数成员三部分组成,定义类的基本形式为:

class 类的名称
{
    public:
        外部接口
    protected:
        保护性成员
    private:
        私有成员
}

其中 public、protected、private 表示访问控制属性,用于控制类成员的访问权限。特别的,没有分配控制属性的默认为 private 私有成员。

类成员访问控制

使用 public 关键字声明的公有成员可在类外访问,即公有类型成员定义了外部接口。输入:

#include<iostream>
using namespace std;
​
class area //定义 area 类。
{
    public: //定义公有成员,外部可以访问。
        double width;
        double length;
};
​
int main()
{
    area area1; //定义对象 area1。
    double AREA; //定义双精度型变量 AREA。
    area1.width=3; //外部访问公有成员,设置宽为 3。
    area1.length=3.1; //外部访问公有成员,设置长为 3.1。
    AREA=area1.width*area1.length; //计算面积。
    cout << AREA <<endl; //输出面积
    return 0;
}

此程序可以分为相对独立的两个部分,一是对 area 类的定义,二是主函数 main()。area 类定义了两个双精度型的公有成员,主函数访问类的公有成员实现数字相乘。

程序结果:

图片描述

使用 protected 关键字声明的受保护成员可在子类中访问。输入:

#include<iostream>
using namespace std;
​
class area //定义 area 类。
{
    protected://定义受保护的成员。
        double width;
};
​
class squarearea:area //定义 squarearea 子类。
{
    public: //定义公有成员。
        void setsquarewidth(double wid); //定义成员函数。
        double getsquarewidth(void);
};
​
//定义子类的成员函数。
void squarearea::setsquarewidth(double wid)
{
    width=wid; //通过 squarearea 子类访问 area 类中受保护的成员 width。
}
double squarearea::getsquarewidth(void)
{
    return width;
}
​
//程序的主函数 。
int main()
{
    squarearea square; //定义对象。
    square.setsquarewidth(3.1); //设置宽度为 3.1。
    cout <<"width:"<<square.getsquarewidth()<<endl; //输出设置的宽度。
    return 0;
}

此程序可以分为相对独立的三个部分,一是对 area 类的定义,二是对 squarearea 子类及子类函数的定义,三是主函数 main()。对于 area 类中受保护的成员 width 可以通过子类进行访问。

程序结果:

图片描述

使用 private 关键字声明的私有成员只能被本类的成员函数访问。输入:

#include<iostream>
using namespace std;
​
class area
{
    public: //定义公有成员
        double length;
        void setwidth(double wid);
        double getwidth(void);
    private://定义私有成员
        double width;
};
​
//定义公有成员函数
void area::setwidth(double wid)
{
    width=wid;
}
double area::getwidth(void)
{
    return width;
}
​
//主函数
int main()
{
    area len1; //定义对象
    area wid1;
    len1.length=3.1; //访问 area 类公有成员。
    cout<<"length:"<<len1.length<<endl;
    wid1.setwidth(3.2); //使用公有成员函数设置宽度。
    cout <<"width:"<<wid1.getwidth()<<endl;
    return 0;
}

此程序可以分为相对独立的两个部分,一是 area 类及其公有成员函数的定义,二是主函数 main()。私有成员 width 只能先被类中成员函数访问,再通过相关的公共成员函数实现外部访问。若在类外部使用 area.width=3.2; 方式访问 area 类的私有成员 width,则会报错。

程序结果:

图片描述

对象

在 C++ 语言中,对象是某类事物的实例。其声明形式为:

类名 对象名;

例如声明 area 类的对象 square:

area square;

访问对象的成员

定义了类及其对象后,则可访问对象的成员。访问 数据成员 基本形式为:

对象名.成员名

例如访问 area 类的对象 square 的数据成员 width:

square.width=3.2;

访问 函数成员 的基本形式为:

对象名.函数名(参数表)

例如访问 area 类的对象 square 的函数成员 setwidth(double wid):

square.setwidth(3.2);

类的成员函数

成员函数描述了类的行为。成员函数在类中只用说明其函数的返回类型、名字和参数表,而函数的具体实现在类外说明,其基本形式为:

class 类名
{
    函数的返回类型 函数名(参数列表)
}

返回值类型 类名::函数名(参数列表) //特别的,在类外说明函数的具体实现时,需要使用类名限制成员函数,其形式为:类名::函数名(参数列表)。
{
    函数体
}

例如在 area 类中有成员函数 void setwidth(double wid);

class area
{
    ...
    void setwidth(double wid);
    ...
}

//在类外说明函数的具体实现
void area::setwidth(double wid)
{
    函数体
}

访问类的公有成员计算体积

挑战

  1. 定义一个 volume 类,其中包含三个 double 型的公有成员 width、length、high。

  2. 在主函数中定义一个用于访问 volume 类成员的对象 volume1 和一个用于保存体积结果的双精度型变量 VOLUME。

  3. 返回 width 为 3、length 为 4,high 为 5.1 的体积结果。

目标

定义一个包含三个 double 型公有成员的类,主函数访问类的公有成员实现体积计算。

提示
  1. 一般使用 class 关键字来定义类。
  2. 对象的声明形式为:类名 对象名。
  3. 访问类的数据成员:对象名.成员名。
代码实现
#include<iostream>
using namespace std;

class volume
{
public:
    double width;
    double length;
    double high;
};


int main()
{
    volume volume1;
    double VOLUME;
    volume1.width = 3;
    volume1.length = 4;
    volume1.high = 5.1;

    cout << volume1.width << endl;
    cout << volume1.length << endl;
    cout << volume1.high << endl;
    VOLUME = volume1.width * volume1.length * volume1.high;
    cout << VOLUME << endl;
    //3
    //4
    //5.1
    //61.2
    return 0;
}

希望对你有帮助!!加油各位!

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

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

相关文章

二叉树顺序结构堆实现

目录 Test.c测试代码 test1 test2 test3 &#x1f387;Test.c总代码 Heap.h头文件&函数声明 头文件 函数声明 &#x1f387;Heap.h总代码 Heap.c函数实现 ☁HeapInit初始化 ☁HeapDestroy销毁 ☁HeapPush插入数据 【1】插入数据 【2】向上调整Adjustup❗ …

关于谷歌新版调试用具(Chrome Dev Tool ),网络选项(chrome-network)默认开启下拉模式的设置

今天在使用谷歌浏览器进行调试的时候&#xff0c;打开调试工具网络选项发现过滤不同模式的选项卡不见了&#xff0c;转而变成一个下拉式选项&#xff0c;如下图 这样一来使得切换不同类型查看的时候变得非常不方便&#xff0c;然后网上查了一下发现这个功能谷歌在很早版本就已…

Mysql 主从库的重新配置

1.从库和主库的数据差异实在太大&#xff0c;反复处理数据耗时耗力&#xff0c;不如重做。 2.备份主数据库(命令备份的) usr/local/mysql/bin/mysqldump -h 100.1.4.42 -P 5566 -u root -p 备份数据库 > /mysql/db/备份的名称.sql 3.停止从库复制 登录到MySQL从库&#x…

腾讯云邀请你参与【腾讯2024技术答人挑战赛】 赢取丰厚的礼品

腾讯云邀请你参与【腾讯2024技术答人挑战赛】 赢取丰厚的礼品 2024年 腾讯礼品大派送 保持技术好奇心是程序员构建护城河的重要一环&#xff0c;快来测测你现在的技术知识面在中国程序员中排第几&#xff1f; 参与答题更有iPad、Pico VR游戏机、Switch等、腾讯云官方认证证书好…

Prometheus+grafana配置监控系统

使用docker compose安装 方便拓展, 配置信息都放在在 /docker/prometheus 目录下 1.目录结构如下 . ├── conf │ └── prometheus.yml ├── grafana_data ├── prometheus_data └── prometheus_grafana.yaml2.创建目录文件 mkdir /docker/prometheus &&am…

Leetcode—2670. 找出不同元素数目差数组【简单】

2024每日刷题&#xff08;一零七&#xff09; Leetcode—2670. 找出不同元素数目差数组 实现代码 class Solution { public:vector<int> distinctDifferenceArray(vector<int>& nums) {unordered_set<int> s;int n nums.size();vector<int> dif…

CapCut - 剪映国际版11.0.0

【应用名称】&#xff1a;CapCut - 剪映国际版 【适用平台】&#xff1a;#Android 【软件标签】&#xff1a;#CapCut #剪映国际版 【应用版本】&#xff1a;11.0.0 【应用大小】&#xff1a;231MB 【软件说明】&#xff1a;软件升级更新。目前大家广泛使用的最令人惊叹、最专业…

linux环境安装git、maven、jenkins等

重启 jenkins的命令&#xff1a; systemctl start jenkins 如果没有vim 命令 可以使用 yum install vim 安装 vim git 下载包地址 https://www.kernel.org/pub/software/scm/git/git-2.28.0.tar.gz 1.安装依赖环境&#xff1a; yum install -y curl-devel expat-devel ge…

2023年03月CCF-GESP编程能力等级认证Python编程二级真题解析

一、单选题(共15题,共30分) 第1题 以下存储器中的数据不会受到附近强磁场干扰的是( )。 A:硬盘 B:U 盘 C:内存 D:光盘 答案:D 第2题 下列流程图,属于计算机的哪种程序结构?( ) A:顺序结构 B:循环结构 C:分支结构 D:数据结构 答案:C 第3题 以下选…

C#用正则表达式判断字符串是否纯数字vs用Char.IsDigit 方法遍历字符数组是否纯数字

目录 一、使用的方法 1.正则表达式 2.Char.IsDigit 方法 二、源码 1.源代码 2.生成效果 一、使用的方法 1.正则表达式 在程序运行过程中&#xff0c;经常需要用户输入数字信息&#xff0c;如输入员工年龄、工资等。使用正则表达式Regex类的IsMatch方法&#xff0c;可以有…

2015年苏州大学837复试机试C/C++

2015年苏州大学复试机试 第一题 题目 有36块砖&#xff0c;现在有36个人&#xff0c;男人能搬4块&#xff0c;女人能搬3块&#xff0c;小孩子两人搬一块&#xff0c;求一次搬完这些砖要男人&#xff0c;女人&#xff0c;小孩多少人&#xff1f; 代码 #include <iostrea…

分析HarmonyOS应用/服务的CPU活动性能

CPU Profiler 性能分析是用来分析CPU性能瓶颈的工具&#xff0c;可以实时查看应用/服务的CPU使用率和线程活动&#xff0c;也可以查看记录的方法跟踪数据、方法采样数据和系统跟踪数据的详情。基于CPU性能分析&#xff0c;您可以了解在一段时间内执行了哪些方法&#xff0c;以及…

Python行定位符

在Python中&#xff0c;每一行代码都有其特定的位置和作用&#xff0c;而行定位符则是指定或确定代码所在行的一种方法。通过行定位符&#xff0c;开发者可以准确地指定代码的位置&#xff0c;从而对程序进行调试、错误处理等操作。本文将详细介绍Python中常见的行定位符&#…

【excel转word】excel怎么转换成word?分享两种方法!

Excel文件想要转换成word文档中&#xff0c;直接粘贴复制的话&#xff0c;可能会导致表格格式错乱&#xff0c;那么如何转换才能够保证表格不错乱&#xff1f;今天分享两个方法&#xff0c;excel表格转换为word文件。 方法一&#xff1a; 首先打开excel表格&#xff0c;将表格…

PyCharm / DataSpell 导入WSL2 解析器,实现GPU加速

PyCharm / DataSpell 导入WSL2 解析器的实现 Windows的解析器不好么&#xff1f;设置WSL2和实现GPU加速为PyCharm / DataSpell 设置WSL解析器设置Interpreter Windows的解析器不好么&#xff1f; Windows上的解析器的确很方便&#xff0c;也省去了我们很多的麻烦。但是WSL2的解…

【51单片机系列】中断优先级介绍及使用

文章来源&#xff1a;《51单片机原理及应用&#xff08;第3版&#xff09;》5.4节。 51单片机采用了自然优先级和人工设置高、低优先级的策略。 当CPU处理低优先级中断&#xff0c;又发生更高级中断时&#xff0c;此时中断处理过程如下图所示。 一个正在执行的低优先级中断服…

深度学习(10)-Keras项目详解(递归神经网络)

一.递归神经网络基础概念 递归神经网络(Recursive Neural Network, RNN)可以解决有时间序列的问题&#xff0c;处理诸如树、图这样的递归结构。 CNN主要应用在计算机视觉CV中&#xff0c;RNN主要应用在自然语言处理NLP中。 1.h0&#xff0c;h1.....ht对应的是不同输入得到的中…

微服务中间件 RabbitMq学习

1、为什么需要Mq 例如在用户注册业务中&#xff0c;用户注册成功后 需要发注册邮件和注册短信&#xff0c;传统的做法有两种 1.串行的方式&#xff1b;2.并行的方式 &#xff1b; 假设三个业务节点分别使用50ms&#xff0c;串行方式使用时间150ms&#xff0c;并行使用时间10…

Mybatis 源码系列:领略设计模式在 Mybatis 其中的应用

文章目录 一、Builder模式二、工厂模式三、单例模式四、代理模式五、组合模式六、模板方式模式七、适配器模式八、装饰器模式九、迭代器模式 虽然我们都知道有23种设计模式&#xff0c;但是大多停留在概念层面&#xff0c;真实开发中很少遇到&#xff0c;Mybatis源码中使用了大…

企业股权结构API:为金融机构提供全面的企业背景调查服务

摘要 在当今快速变化的商业环境中&#xff0c;金融机构面临着日益复杂的风险管理挑战。为了做出明智的投资和信贷决策&#xff0c;深入了解企业的股权结构和实际控制人信息变得至关重要。企业股权结构API作为一种创新工具&#xff0c;为金融机构提供了一种高效、便捷的途径&am…