【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装

🐌博主主页:🐌​倔强的大蜗牛🐌​

📚专栏分类:C++
❤️感谢大家点赞👍收藏⭐评论✍️

一、面向过程和面向对象初步认识

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

​ 

 

 面向对象的概念:

面向对象(Object-Oriented Programming,OOP)是一种编程思想,它以对象为基础来设计和构建软件系统。在面向对象编程中,对象是核心概念,它代表现实世界中的实体或概念,并具有属性(数据)和方法(操作数据的函数)。

面向对象编程的主要特点包括封装、继承、多态和抽象。封装隐藏了对象的内部实现,只提供有限的接口与外界交互;继承允许一个类继承另一个类的特性,实现代码复用;多态让不同类的对象能够以统一的方式被处理;抽象则是对现实世界的简化,以便于理解和建模。

面向对象编程的优势在于提高代码的可重用性、可维护性和可扩展性,使软件系统更加符合现实世界的需求和逻辑。

二、类的引入

C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。
比如:
在数据结构中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现,
会发现struct中也可以定义函数。
typedef int DataType;
struct Stack
{void Init(size_t capacity){_array = (DataType*)malloc(sizeof(DataType) * capacity);if (nullptr == _array){perror("malloc申请空间失败");return;}_capacity = capacity;_size = 0;}void Push(const DataType& data){// 扩容_array[_size] = data;++_size;}DataType Top(){
return _array[_size - 1];}void Destroy(){if (_array){free(_array);_array = nullptr;_capacity = 0;_size = 0;}}DataType* _array;size_t _capacity;size_t _size;
};
int main()
{Stack s;s.Init(10);s.Push(1);s.Push(2);s.Push(3);cout << s.Top() << endl;s.Destroy();return 0;
}
上面结构体的定义,在C++中更喜欢用class来代替。

三、类的定义

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面
号不能省略
类体中内容称为类的成员:类中的变量称为类的属性成员变量; 类中的函数称为类的方法或者
成员函数

类的两种定义方式:

1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成
联函数处理。
#include<iostream>class MyClass {
public:// 成员函数声明和定义void printHello() {std::cout << "Hello, World!"<< std::endl;}int add(int a, int b) {return a + b;}
};int main() {MyClass obj;obj.printHello(); // 输出 "Hello, World!"int sum = obj.add(1, 2); // sum = 3std::cout << "Sum: "<< sum<< std::endl;return 0;
}

在这个示例中,`MyClass` 类包含两个成员函数:`printHello()` 和 `add()`。这两个函数的声明和定义都放在类体内。当编译器看到这些成员函数的定义时,它们可能会被视为内联函数,从而提高程序的性能。然而,这也可能导致代码膨胀,因此在实际编程中需要权衡利弊。

2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名:: 

 myclass.h 文件:

#ifndef MYCLASS_H
#define MYCLASS_Hclass MyClass {
public:// 成员函数声明void printHello();int add(int a, int b);
};#endif // MYCLASS_H

myclass.cpp 文件:

#include "myclass.h"
#include<iostream>// 成员函数定义
void MyClass::printHello() {std::cout << "Hello, World!"<< std::endl;
}int MyClass::add(int a, int b) {return a + b;
}

main.cpp 文件:

#include "myclass.h"int main() {MyClass obj;obj.printHello(); // 输出 "Hello, World!"int sum = obj.add(1, 2); // sum = 3std::cout << "Sum: "<< sum<< std::endl;return 0;
}

在这个示例中,MyClass 类的声明放在了 myclass.h 文件中,而成员函数的定义放在了myclass.cpp 文件中。这样可以避免头文件中的重复包含,同时也有助于代码的模块化和组织。在 main.cpp 文件中,我们只需要包含 myclass.h 头文件,即可使用 MyClass 类的功能。

 四、类的访问限定符及封装

  •  访问限定符
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选
择性的将其接口提供给外部的用户使用。

【访问限定符说明】  

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. 如果后面没有访问限定符,作用域就到 } 即类结束
  5. class的默认访问权限为private,struct为public(因为struct要兼容C)

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别  

问题:C++中struct和class的区别是什么?

C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的
类默认访问权限是private。
  • 封装
面向对象的三大特性:封装、继承、多态。
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互。

 封装本质上是一种管理,让用户更方便使用类

 在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来

隐藏对象内部实现细节,控制那些方法可以在类外部直接被使用

❤️结语: 

本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,大星必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!

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

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

相关文章

C++设计模式:代理模式(十三)

1、代理模式 定义&#xff1a;为其他对象提供一种代理以控制&#xff08;隔离使用接口&#xff09;对这个对象的访问等。 动机 在面向对象系统中&#xff0c;有些对象由于某种原因&#xff08;比如对象需要进程外的访问等&#xff0c;例如在分布式的系统中&#xff09;&#x…

【ZZULIOJ】1063: 最大公约与最小公倍(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 输入两个正整数&#xff0c;输出其最大公约数和最小公倍数。 输入 输入两个正整数n和m&#xff08;n,m<1000000)。输入保证最终结果在int范围内。 输出 输出两个整数&#xff0c;用空格…

【项目实战经验】DataKit迁移MySQL到openGauss(下)

上一篇我们分享了安装、设置、链接、启动等步骤&#xff0c;本篇我们将继续分享迁移、启动~ 目录 9. 离线迁移 9.1. 迁移插件安装 中断安装&#xff0c;比如 kill 掉java进程&#xff08;安装失败也要等待300s&#xff09; 下载安装包准备上传 缺少mysqlclient lib包 mysq…

oracle rac打补丁后sqlplus / as sysdba ora-12537

sqlplus / as sysdba 报错&#xff1a; ORA-12537: TNS:connection closed 检查用户属组&#xff1a; [rootrac1 ~]# id oracle uid1102(oracle) gid1101(oinstall) groups1101(oinstall),1102(dba) [rootrac1 ~]# id grid uid1101(grid) gid1101(oinstall) groups1101(oin…

大语言模型LLM《提示词工程指南》学习笔记03

文章目录 大语言模型LLM《提示词工程指南》学习笔记03链式提示思维树检索增强生成自动推理并使用工具自动提示工程师Active-Prompt方向性刺激提示Program-Aided Language ModelsReAct框架Reflexion多模态思维链提示方法基于图的提示大语言模型LLM《提示词工程指南》学习笔记03 …

【零基础学数据结构】双向链表

1.双向链表的概念 1.1头节点 1.2带头双向循环链表 注意&#xff1a; 哨兵位创建后&#xff0c;首尾连接自己 1.3双链表的初始化 // 双向链表的初始化 void ListInit(ListNode** pphead) {// 给双链表创建一个哨兵位*pphead ListBuyNode(-1); } 2.双向链表的打印 // 双向…

怎么用docker安装MySQL

可以访问 Docker Hub 上的 MySQL 镜像仓库。在 MySQL 官方仓库页面上&#xff0c;会列出所有可用的镜像标签及其对应的版本。 以下是使用 Docker 安装 MySQL 8 的基本步骤&#xff1a; 拉取官方的 MySQL 8 镜像&#xff1a; docker pull mysql:8 运行一个 MySQL 容器实例&a…

蓝桥杯备考随手记: 常见的二维数组问题

在Java中&#xff0c;二维数组是一种可以存储多个元素的数据结构。它由多个一维数组组成&#xff0c;这些一维数组可以看作是行和列的组合&#xff0c;形成了一个矩阵。 1. 二维数组旋转问题 二维数组的旋转是指将数组中的元素按照一定规则进行旋转。通常有两种常见的旋转方式…

SpringBoot 面试题(四)

1. 如何使用SpringBoot实现定时任务&#xff1f; 在Spring Boot中实现定时任务&#xff0c;通常可以使用Scheduled注解。以下是一个简单的例子说明如何在Spring Boot应用中创建一个定时任务&#xff1a; 首先&#xff0c;确保你的Spring Boot项目中包含了Spring Scheduler的依…

安卓Android.nfc读卡

使用安卓手机&#xff0c;通过NFC功能可以读取IC卡信息&#xff0c;。 IC卡有很多种卡标准&#xff0c;协议&#xff0c;等等&#xff0c;这些具体就不细讨论。 主要讨论&#xff0c;2种卡&#xff0c;一种是M1卡&#xff0c;另外是CPU卡。 1、 M1卡 M1卡是市面上比较常见的卡…

利用Tess4J实现图片文字识别

利用Tess4J实现图片文字识别 前言 光学字符识别&#xff08;OCR&#xff09;技术允许计算机通过扫描仪、摄像头等设备来识别并转换印刷或手写文本的图像数据为可编辑的文本格式。Tess4J是一个优秀的Java库&#xff0c;提供了与Tesseract OCR引擎的集成&#xff0c;方便进行图片…

为什么在cmd中输入jupyter notebook会出现问题

C:\Users\REBECCA329>jupyter notebook jupyter 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 这是什么意思&#xff1f;这个说明在cmd中找不到jupyter notebook&#xff0c;说明没有添加到环境变量里去&#xff0c;在配置R内核的时候找不到&#xff…

cocos creator开发中遇到的问题和解决方案

前言 总结一下使用cocos开发遇到的坑&#xff0c;不定期更新。 问题汇总 代码修改Position坐标不生效 首先要通过打log或者断点排除下是不是逻辑上的问题&#xff0c;还有是不是有动画相关把位置修改了。我遇到的问题是坐标修改被widget组件覆盖了。 纹理压缩包体变大 co…

TSINGSEE青犀AI智能分析网关V4叉车载货出入库检测算法介绍及应用

随着物流行业的快速发展&#xff0c;叉车作为物流运输的重要设备&#xff0c;其安全性和效率性越来越受到人们的关注。然而&#xff0c;在实际操作中&#xff0c;由于人为因素和操作环境的复杂性&#xff0c;叉车事故时有发生&#xff0c;给企业和个人带来了巨大的损失。为了提…

一些错误的记录

Linux使用rz命令出现乱码&#xff1f; 使用下面的命令上传&#xff1a; rz -besz filename //从linux操作系统上下载文件&#xff08;夹&#xff09;到本地云服务器上的redis连接不上&#xff0c;本地的图形化界面 1.在云服务器控制台-防火墙开放6379端口(使用命令开放端口不…

MySQL-进阶篇-一条sql更新语句是如何执行的(redo log和binlog)

上一篇&#xff1a;一条sql查询语句是如何执行的 http://t.csdnimg.cn/nV3EY 摘自&#xff1a;林晓斌MySQL实战45讲——第二篇 更新语句的执行过程与上一篇查询流程相同&#xff0c;本篇简写。 但多了两个重要的日志模块&#xff1a;redo log&#xff08;重做日志&#xff0…

Java 中什么是同步集合什么是并发集合,同步集合与并发集合有什么区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Java 中的同步集合与并发集合有什么区别 同步集合适用于简单的并发场景,其中线程对集合的访问和修改不频繁。而并发集合则更适用于高并发场景,其…

CorelDRAW2024破解注册机授权码分享

CorelDRAW是一款由加拿大Corel公司开发的平面设计软件&#xff0c;主要用于矢量图形制作、排版和编辑。它以其强大的功能和用户友好的界面而广受欢迎&#xff0c;被广泛应用于各个领域&#xff0c;包括设计、广告、出版和印刷等。 CDR2017-2024全版本下载网盘汉化版链接: http…

js可视化爬取数据生成当前热点词汇图

功能 可以爬取到很多数据&#xff0c;并且生成当前的热点词汇图&#xff0c;词越大越热门&#xff08;词云图&#xff09; 这里以b站某个评论区的数据为例&#xff0c;爬取63448条数据生成这样的图片 让我们能够更加直观的看到当前的热点 git地址 可以直接使用&#xff0c;中文…

pyqt 标题栏设置

在PyQt中&#xff0c;可以通过QWidget或其子类&#xff08;如QMainWindow或QDialog&#xff09;的setWindowTitle()方法来设置窗口的标题栏。以下是一个简单的例子&#xff0c;展示了如何为应用程序的主窗口设置标题&#xff1a; import sys from PyQt5.QtWidgets import QApp…