基于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.2return 0;
}

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

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

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

相关文章

C++/数据结构:二叉搜索树的实现与应用

目录 一、二叉搜索树简介 二、二叉搜索树的结构与实现 2.1二叉树的查找与插入 2.2二叉树的删除 2.3二叉搜索树的实现 2.3.1非递归实现 2.3.2递归实现 三、二叉搜索树的k模型和kv模型 一、二叉搜索树简介 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0…

IDEA的properties默认编码是UTF-8但是不显示中文

问题描述 今天打开IDEA项目&#xff0c;发现messages_zh_CN.properties不显示中文了 但奇怪的是target下的文件就是展示的中文 而且我IDEA已经配置了编码格式是UTF-8了 使用nodepad打开源文件&#xff0c;也是展示编码格式是UTF-8 &#xff08;打开target下的文件&#xff0c;…

硅谷仿制网易云小程序登录问题解决

引言&#xff1a; 尚硅谷视频中的登录拥挤问题&#xff0c;导致无法登录&#xff0c;所以&#xff0c;我去gitee上从新找了个别人搞好点网易云的api接口【也是比较出名的那个&#xff0c;不想用不行啊&#xff0c;我也试过很多方法都不行】 接口详解网址&#xff1a;网易云音乐…

python基础——池

池的介绍&#xff1a; 提前创建进程池&#xff0c;防止创建的进程数量过多导致系统性能受到影响&#xff0c;在系统执行任务时&#xff0c;系统会使用池中已经创建进程/线程&#xff0c;从而防止资源的浪费&#xff0c;创建的进程/线程可以让多个进程使用&#xff0c;从而降低…

TypeScript Array(九) 数组

1.TypeScript Array 数组 1.1. 描述 数组对象是使用单独的变量名来存储一系列的值。  &emsp比如&#xff0c;你现在有一组数据&#xff0c;存单独变量如下&#xff1a; var data1"Android"; var data2"Java"; var data3"Harmony";那如果有…

南昌市青山湖、滕王阁、洛阳路隧道FM调频广播集群通信调度系统应用案例

一、用户需求 青山湖隧道&#xff0c;是南昌市一条东西走向的城市主干道&#xff0c;隧道为双向6车道&#xff0c;长1070米&#xff0c;其中湖底暗埋段为550米&#xff0c;净高5.45米&#xff0c;两孔每孔净宽12.4米。 滕王阁隧道是南昌市沿江北大道与沿江中大道连通工程&#…

计算机网络实验二

目录 实验二 交换机的基本配置 1、实验目的 2、实验设备 &#xff08;1&#xff09;实验内容&#xff1a; &#xff08;2&#xff09;练习&#xff1a; 1.实验内容一&#xff1a;&#xff08;交换机的配置方式&#xff09; 2.实验内容二&#xff1a;&#xff08;交换机…

云打印怎么收费?云打印需要付费吗?

随着云打印概念的火热发展&#xff0c;很多有打印需求的App或者个人用户都想使用易绘创云打印服务。那么易绘创云打印怎么收费&#xff1f;云打印需要付费吗&#xff1f;今天就带大家来了解一下。 云打印怎么收费&#xff1f;云打印需要付费吗&#xff1f; 很多有打印需求的小…

正则表达式 与文本三剑客(sed grep awk)

一&#xff0c;正则表达式 &#xff08;一&#xff09;正则表达式相关定义 1&#xff0c;正则表达式含义 REGEXP&#xff1a; Regular Expressions&#xff0c;由一类特殊字符及文本字符所编写的模式&#xff0c;其中有些字符&#xff08;元字符&#xff09;不表示字符字面意…

EMQX 性能调优:TCP SYN 队列与 Accept 队列

在上一篇博客&#xff08;EMQX 性能调优&#xff1a;最大连接与文件描述符&#xff09;&#xff0c;我们深入研究了 MQTT 连接与文件描述符之间的关系&#xff0c;介绍了如何修改文件描述符相关的内核参数来突破默认的最大连接数量限制。 但你可能会发现&#xff0c;在某些情况…

Java 面向对象进阶 03 static 注意事项、重新认识main方法(黑马)

案例代码如下&#xff1a; 非静态的方法虚拟机会自带一个关键字&#xff0c;如下&#xff1a; 但是不能手动出来&#xff0c;它的类型就是当前类&#xff1b; 通过输出this&#xff0c;得到当前s1,s2 的地址&#xff1b; 所以在输出时会有隐藏的this&#xff0c;所以this所指向…

Redis -- 单线程模型

失败是成功之母 ——法国作家巴尔扎克 目录 单线程模型 Redis为什么这么快 单线程模型 redis只使用一个线程&#xff0c;处理所有的命令请求&#xff0c;不是说redis服务器进场内部真的就只有一个线程&#xff0c;其实也有多个线程&#xff0c;那就是处理网络和io的线程。 R…

MBR分区转换为GPT分区

这里有一个ecs-test用于测试MBR转换为GPT 新增一块数据盘 将数据盘以MBR分区格式分区 将整块磁盘以mbr形式分区 格式化&#xff0c;挂载等 上传文件&#xff0c;方便测试(以便后续转换格式类型&#xff0c;防止文件丢失) 取消挂载 将MBR转换为GPT 需先下载gdisk yum instal…

前端常见的栈溢出报错

什么是栈溢出&#xff1f; 在前端开发中&#xff0c;栈溢出是指JavaScript引擎执行代码时&#xff0c;调用栈&#xff08;call stack&#xff09;变得太大&#xff0c;超过了浏览器或JavaScript引擎所分配的栈空间&#xff0c;从而导致栈溢出错误。调用栈是一种数据结构&#x…

Spring-集成Web

一、引子 前面我们在Spring集成Junit中为读者引出了Spring善于集成其它框架的优势&#xff0c;而Spring项目不可能仅限于小范围的某个方法的测试&#xff0c;终究会落脚于Web项目上。于是&#xff0c;我们就从这里正式进入Spring集成Web的话题。由于笔者会从原生的Java Web开发…

@Test Annotation属性- dependsOnMethods属性

目录 语法 如果test1&#xff08;&#xff09;失败了怎么办&#xff1f;test2&#xff08;&#xff09;测试会发生什么&#xff0c;因为它依赖于test1&#xff1f; 如果我们在test1&#xff08;&#xff09;方法上不使用Test注释&#xff0c;但在test 2&#xff08;&#xf…

【产业实践】使用YOLO V5 训练自有数据集,并且在C# Winform上通过onnx模块进行预测全流程打通

使用YOLO V5 训练自有数据集,并且在C# Winform上通过onnx模块进行预测全流程打通 效果图 背景介绍 当谈到目标检测算法时,YOLO(You Only Look Once)系列算法是一个备受关注的领域。YOLO通过将目标检测任务转化为一个回归问题,实现了快速且准确的目标检测。以下是YOLO的基…

B2119 删除单词后缀

网址如下&#xff1a; B2119 删除单词后缀 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 算是找了个操作字符串的题来做 可以说C的string类确实是好用&#xff0c;但是还是不够熟悉&#xff0c;我不清楚怎么删去string类的后面几个字符 用C的常规做法是在相应地点设\0&…

校园二手交易小程序|基于微信小程序的闲置物品交易平台设计与实现(源码+数据库+文档)

校园二手交易小程序目录 目录 基于微信小程序的闲置物品交易平台设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、商品信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕…

R语言基础学习-02 (此语言用途小众 用于数学 生物领域 基因分析)

变量 R 语言的有效的变量名称由字母&#xff0c;数字以及点号 . 或下划线 _ 组成。 变量名称以字母或点开头。 变量名是否正确原因var_name2.正确字符开头&#xff0c;并由字母、数字、下划线和点号组成var_name%错误% 是非法字符2var_name错误不能数字开头 .var_name, var.…