【C++】类和对象(一):什么是面向对象,访问限定符有哪些,类定义细节,结构体和类的关系。

在这里插入图片描述

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍

文章目录

  • 一、什么是面向对象?
    • 1.面向过程:
    • 2.面向对象:
  • 二、从struct到class
  • 三、访问限定符
  • 四、class的引入
  • 五、类的定义
    • 1.标准格式
    • 2.类的两种定义方式:
      • (1) 声明和定义全部放在类体中
      • (2) 声明和定义分离
    • 3.注意事项
  • 六、class 和 struct的区别

一、什么是面向对象?

1.面向过程:

我们刚开始接触计算机这门学科时,我们学习的第一个编程语言就是C语言,C语言是面向过程的一门语言。面向过程是一种编程思想,它以实现功能的函数开发为主,需要详细处理每一个细节,通常以函数的形式来一步一步实现整个功能。这种编程方式更侧重于解决问题的整个过程。
例如:洗衣服这一行为:在这里插入图片描述

2.面向对象:

面向对象是一种编程思想,它将现实世界中的事物抽象成一个个对象,通过对象之间的交互来完成程序的设计和实现。
它具有三大特性:封装继承多态等特性,可以更加方便地进行程序设计和维护。

(1) 封装:指将对象的属性和方法封装在一起,对外部隐藏对象的实现细节,只暴露必要的接口。这样可以保证对象的安全性和可靠性,同时也方便了程序的调用和维护。
(2) 继承:指通过继承已有的类来创建新的类,新的类可以继承父类的属性和方法,并且可以在此基础上进行扩展和修改。这样可以减少代码的重复,提高代码的复用性和可维护性。
(3) 多态;指同一个方法可以在不同的对象上产生不同的行为,这样可以提高程序的灵活性和可扩展性。多态可以通过重载和重写来实现。
例如:洗衣服这一行为:
在这里插入图片描述
这里面一共有四个对象,也就是人,洗衣液,脏衣服,洗衣机
具体实现过程是:人把洗衣液脏衣服放入洗衣机
四个对象相互合作,从而实现洗衣服这一过程,然而,人并不知到洗衣机的具体是怎样洗衣服的,这也体现了面向对象的封装性。

二、从struct到class

在C语言中我们学习过结构体,它只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。在C++中,struct依然可以使用,它兼容了C语言中struct的所有用法,并将struct升级成为类。

  • 成为类后,struct中现在不仅可以定义变量,还可以定义函数。它的优势可以体现在如下代码。
    例如:在C语言中实现栈和队列中的函数名相同,但是,C语言中函数是写在全局的,不允许同名函数,必须要在函数名前加上表示。但是,使用C++的struct就可以很好的避免这个问题,

//定义队列
struct Queue
{
//一、定义队列
	//头指针
	QNode* head;
	//尾指针
	QNode* tail;
	//链表长度
	int size;
//二、定义栈的相关方法
    //入队
	void Push(QNode*){ }
    //出队
	DataType Top(){ }
};

struct Stack
{
	//一、定义栈的相关变量
	int* _array;
	size_t _capacity;
	size_t _size;
	//二、定义栈的相关方法
	//压栈
	void Push(int x){ }
	//出栈
	DataType Top(){ }
};
int main()
{
    //栈
	Stack s;
	s.Push(1);
	cout << s.Top() << endl;
	//队列
	Queue q;
	q.Push(6);
    cout << q.Top() << endl;
	return 0;
}

我们可以直接使用栈Stack的各种方法和队列Queue的各种方法,不用考虑同名的问题。

三、访问限定符

在这里插入图片描述

  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  • 如果后面没有访问限定符,作用域就到 } 即类结束

四、class的引入

在上述例子中如果使用类来写这个栈是怎样的呢?如下代码:

class stack2
{
public:
	//压栈
	void Push(int x) { }
	//出栈
	DataType Top() { }
private :
	int* _array;
	int _capacity;
	int _size;
};


int main()
{
	stack2 Ss;
	Ss.Push(9);
	cout << Ss.Top() << endl;
}

五、类的定义

1.标准格式

在C++中类的定标准格式是:

class stack2
{
public:
	//压栈
	void Push(int x) { }
	//出栈
	DataType Top() { }
private :
	int* _array;
	int _capacity;
	int _size;
};
  • 类中由成员函数和成员变量组成
  • 不要忘记最后的分号。

2.类的两种定义方式:

(1) 声明和定义全部放在类体中

如上面栈的代码,栈的声明和定义全部写在类中。
需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理

(2) 声明和定义分离

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

void Stack::Push(int x) 
{
//.......
 }

::表示Push函数是Stack这个域中的。如果Push中有一个变量n,编译器会首先检查是不是当前局部变量中定义的,如果不是,则会去Stack这个域中去找。

3.注意事项

  • class中定义的变量,惯例是private类型的。
  • class中的访问限定符如果不写,默认是private
  • 默认定义在类中的就是内联(inline
  • 函数的声明和定义很好区分。就是是否有具体实现。
  • 变量的声明就是还没有开空间,变量的定义就是已经赋值开辟空间了。
  • 长的函数,声明和定义分离。
  • 短小的函数,可以直接写在类中。
  • 成员变量的命名前加_或者m_,表示这个是内部成员里的
    例如:在写一些初始化函数时,将值赋给类中的变量,这样写容易分不清楚哪个是成员变量
	void Init(int year,int month,int day)
	{
		year = year;
		month = month;
		day = day;
	}

为了便于区分,建议这样写:

	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}

六、class 和 struct的区别

  • C++中struct可以当成结构体使用,还可以用来定义类。
  • struct定义的类默认访问权限是public,class定义的类默认访问权限是private

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

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

相关文章

机组 指令系统

机器指令 机器指令&#xff1a;每一条机器语言的语句 指令系统&#xff1a;全部机器指令的集合 指令的一般格式 指令由操作码和地址码两部分组成 操作码 作用&#xff1a;指明该指令要完成的操作 位数&#xff1a;反映机器的操作种类&#xff0c;即机器允许的指令条数 …

瞅瞅 Opencv:扫描图像

扫描图像查询表 一、概述二、图像矩阵如何存储在内存中?三、高效的方式四、迭代器(安全)方法五、带引用返回的动态地址计算六、核心功能七、性能差异 一、概述 让我们考虑一种简单的色彩还原方法。通过使用unsigned char C和c类型进行矩阵项存储&#xff0c;一个像素通道可以…

音视频技术开发周刊 | 318

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 日程揭晓&#xff01;速览深圳站大会专题议程详解 LiveVideoStackCon 2023 音视频技术大会深圳站&#xff0c;保持着往届强大的讲师阵容以及高水准的演讲质量。两天的参会…

git commit规范提交

Git每次提交代码时&#xff0c;都要写Commit Message&#xff08;提交说明&#xff09;&#xff0c;通常情况下&#xff0c;Commit Message应该清晰明了&#xff0c;说明本次提交的目的和具体操作等。然而笔者工作多年来发现&#xff0c;有些公司对Commit Message没有明确的要求…

wpf Grid布局详解 `Auto` 和 `*` 是两种常见的设置方式 行或列占多个单元格,有点像excel里的合并单元格。使其余的列平均分配剩余的空间

比如只有行的界面 <Window x:Class"GenerateTokenApp.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/exp…

SpringCloudAlibaba——Sentinel

Sentinel也就是我们之前的Hystrix&#xff0c;而且比Hystrix功能更加的强大。Sentinel是分布式系统的流量防卫兵&#xff0c;以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级等多个维度保护服务的稳定性。 Sentinel采用的是懒加载&#xff0c;这个接口被访问一次&a…

企业级低代码开发,科技赋能让企业具备“驾驭软件的能力”

科技作为第一生产力&#xff0c;其强大的影响力在各个领域中都有所体现。数字技术&#xff0c;作为科技领域中的一股重要力量&#xff0c;正在对传统的商业模式进行深度的变革&#xff0c;为各行业注入新的生命力。随着数字技术的不断发展和应用&#xff0c;企业数字化转型的趋…

SpringBoot自动装配 Spring相关 常用设计模式 双亲委派 MongoDB Redis 适配器模式与策略模式

SpringBoot自动装配 阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 Spring相关 阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 常用设计模式 双亲委派 Java虚拟机定义了三个主要的类加载器: 1、启动类加载器 2、扩展类加载器 …

《网络协议》02. 物理层 · 数据链路层 · 网络层

title: 《网络协议》02. 物理层 数据链路层 网络层 date: 2022-08-31 22:26:48 updated: 2023-11-08 06:58:52 categories: 学习记录&#xff1a;网络协议 excerpt: 物理层&#xff08;数据通信模型&#xff0c;信道&#xff09;、数据链路层&#xff08;封装成帧&#xff0c…

CSDN中: Markdown编辑器使用说明

Markdown编辑器使用说明 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一…

Android UI 开发·界面布局开发·案例分析

目录 ​编辑 1. 线性布局&#xff08;LinearLayout&#xff09; 2. 相对布局&#xff08;RelativeLayout&#xff09; 3. 表格布局&#xff08;TableLayout&#xff09; 4. 帧布局&#xff08;FrameLayout&#xff09; 5. 网格布局&#xff08;GridLayout&#xff0…

05【保姆级】-GO语言的标识符

之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&#xff0c;然后know why。先做出来&#xff0c;然后再去一点点研究&#xff0c;才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

Android 10.0 系统默认打开OEM解锁开关功能实现

1.前言 在10.0的系统定制中,在9.0系统以后为了设备的安装,系统开始启用oem机制,所以在adb push文件就需要先oem解锁,然后才可以 进行相关操作,所以就需要默认打开oem解锁的开关,来方便oem解锁功能的实现 如图: 2.系统默认打开OEM解锁开关功能实现的核心类 packages\ap…

初步了解 RabbitMQ

目录 ​编辑一、MQ 概述 1、MQ 的简介 2、MQ 的用途 &#xff08;1&#xff09;限流削峰 &#xff08;2&#xff09;异步解耦 (3)数据收集 二、RabbitMQ 概述 1、RabbitMQ 简介 2、四大核心概念 3、RabbitMQ 的核心部分 ​编辑 4、名词解释&#xff1a; 三、Hello …

ESP32 C3 smartconfig一键配网报错

AP配网 在调试我的esp32c3的智能配网过程中&#xff0c;发现ap配网使用云智能App是可以正常配置的。 切记用户如果在menu菜单里使能AP配网&#xff0c;默认SSID名字为adh_PK值_MAC后6位。用户可以修改这个apssid的键值&#xff0c;但是要使用云智能app则这个名字的开头必须为ad…

香港金融科技周VERTU CSO Sophie谈Web3.0的下一个风口 手机虚拟货币移动支付

10月31日&#xff0c;香港金融科技周正式拉开帷幕。这项香港金融科技界地年度盛事今年已经踏入了第八届&#xff0c;本届活动吸引超过数百位金融科技专业人士、创业者和行业领袖现场参与&#xff0c;线上参与观众超过10万人次。 在金融科技周的圆桌会议上&#xff0c;VERTU首席…

Java-继承

1 继承 1.1 为什么需要继承 Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;那在设计程序是就需要考虑。 以下…

Vulnhub靶场之Funbox

正如该靶场的描述所说&#xff0c;它对初学者来说非常简单。 项目地址&#xff1a;Funbox: Scriptkiddie ~ VulnHub 所需工具&#xff1a; KaliLinux即可。 0x00 信息收集 打开虚拟机后使用nmap扫描一下网段存活&#xff0c;这里我给的虚拟机的范围是100-253,其中kali的IP是10…

Git 安全警告修复手册:解决 `fatal: detected dubious ownership in repository at ` 问题 ️

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

postman接口测试

postman使用 开发中经常用postman来测试接口&#xff0c;一个简单的注册接口用postman测试&#xff1a; 接口正常工作只是最基本的要求&#xff0c;经常要评估接口性能&#xff0c;进行压力测试。 postman进行简单压力测试 下面是压测数据源&#xff0c;支持json和csv两个格式…