类与对象(上篇)

news2024/12/23 19:40:28

类与对象

  • 面向过程和面向对象
  • 类的引入
  • 类的定义
  • 类的访问限定符及封装
    • 访问限定符
    • 封装
  • 类的作用域
  • 类的实例化
  • 类对象
    • 类对象的存储方式
  • 类成员函数的this指针
    • this指针的引出
    • this指针的特性

面向过程和面向对象

C语言是面向过程,注重的是过程,先分析求解问题的步骤,通过函数调用逐步解决问题

C++是面向对象,注重的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成

类的引入

在C++中结构体内不仅可以定义变量,也可以定义函数。相当于对结构体进行了升级

栈的实现

struct Stack
{
	void Init(int capacity)
	{}

	void Push(Datatype data)
	{}

	Datatype top()
	{}

	void Destory()
	{}

	Datatype* a;
	int capacity;
	int top;
};

在C++中更喜欢用类来实现上面的程序,并增加了一些其他的功能

类的定义

class classname//类名
{
	//类体:成员变量成语函数组成
};

类体中的内容是类的成员:类中的变量称作类的属性(成员变量);类中的函数称作类的方法(成员函数)

类的两种定义方式:

  1. 声明和变量全部放在类体中,如果成员变量在类中定义,则默认为内敛函数
class Person
{
public:
	//展示个人信息
	void Show()
	{
		cout << _name << " " << _age << " " << _sex << endl;
	}
private:
	char* _name;
	int _age;
	char* _sex;
};
  1. 类声明函数放在 .h文件(头文件)中,成员函数放在 .cpp`文件(源文件)中;声明和定义分离,成员函数名前需要加上类名::

函数声明
在这里插入图片描述

函数定义

在这里插入图片描述

类的访问限定符及封装

访问限定符

通过类将对象的属性(变量)与方法(函数)结合在一起,使对象更加完善,通过访问权限选择性地将其提供给外部使用

在这里插入图片描述

访问限定符说明

  1. public修饰的成员在类的外部可以直接访问
  2. private修饰的成员在类的外部不能直接被访问
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现结束
  4. 如果后面没有访问限定符,作用域遇到}便会结束
  5. class的默认访问权限是private,struct的默认访问权限是public

封装

概念:将数据和操作数据的方式进行结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

封装是一种管理,可以更方便地使用类。就类似于电子产品只有封装之后才会给用户使用,用户不需要了解其内部的原理细节之类,使用起来方便就行

类的作用域

类的所有成员都在类的作用域中,在类体外定义成员时,需要使用 ::
作用域限定符指明成员所属的类域

class Person
{
public:
	void Show();
private:
	char* _name;
	int _age;
	char* _sex;
};

//Show属于Person定义时,需要使用  ::
void Person::Show()
{
	cout << _name << " " << _age << " " << _sex << endl;
}

类的实例化

通过类创建对象的过程,称作类的实例化

  1. 类是对对象进行描述,类似用于制造的图纸,限定类的成员,定义出的类并没有分配实际的内存空间来进行存储
  2. 一个类可以实例化(定义)多个对象,实例化的对象,占用实际的物理空间,存储类的成员变量

类对象

类对象的存储方式

class M1
{
public:
	void test1();
private:
	int _i;
};

class M2
{
public:
	void test2();
};

class M3
{
	
};

int main()
{
	cout << sizeof(M1) << endl;
	cout << sizeof(M2) << endl;
	cout << sizeof(M3) << endl;
	return 0;
}

在这里插入图片描述
通过打印结果可以观察到:

类M2与类M3的大小相同,表明类中的成员函数,在类中不占内存,也就是说类中并不保存成员函数,不存储有效数据,占位,标识对象的存在;否则如果打印结果为0,对象实例化之后,大小为0,又该如何去标识呢

而类M1的大小是成员变量类型的大小,所以类中只保存成员变量。与结构体类似,类也是需要内存对齐的。

类成员函数的this指针

this指针的引出

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

	void Print()
	{
		cout << this << endl;
		cout << _year << " " << _month << " " << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1, d2;
	d1.Init(2022, 12, 4);
	d1.Print();
	cout << &d1 << endl;
	d2.Init(2022, 12, 5);
	d2.Print();
	cout << &d2 << endl;
	return 0;
}

在这里插入图片描述

从上面的运行结果可以看出,之所以当d1调Init函数时,函数知道应该设置d1对象,而不是设置d2对象;是因为,在调用函数时,传递了一个this指针,也就是对象本身的地址。

C++编译器给”非静态的成员函数“增加了一个隐藏的指针参数,使该指针指向当前对象,在函数体中所有的成员变量的操作,都是通过该指针去访问的;该指针的定义和传递都是由编译器来完成的。

this指针在类的成员函数中,作为形参,一般存放在栈帧中

this指针的特性

  1. this指针的类型:类类型 *const,所以成员变量中,不能给this赋值
  2. 只能在成员函数内部使用
  3. this指针本质上是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参,故对象中是不存在this指针的
  4. this指针是成员函数第一个隐含的指针形参,一般情况下是有寄存器通过ecx寄存器自动传递的

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

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

相关文章

【计算机视觉】目标检测中Faster R-CNN、R-FCN、YOLO、SSD等算法的讲解(图文解释 超详细必看)

觉得有帮助请点赞关注收藏~~~ 一、基于候选区域的目标检测算法 基于候选区域的深度卷积神经网络&#xff08;Region-based Convolutional Neural Networks&#xff09;是一种将深度卷积神经网络和区域推荐相结合的物体检测方法&#xff0c;也可以叫做两阶段目标检测算法。第一…

Web大学生网页作业成品——环保垃圾分类网站设计与实现(HTML+CSS+JavaScript) web前端开发技术 web课程设计 网页规划与设计

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

RFID标签让企业海量固定资产实现科学化管理

近年来&#xff0c;随着物联网、IoT、移动技术、云计算技术的成熟&#xff0c;越来越多的企业开始使用RFID标签管理企业海量的固定资产。优化固定资产标准化管理流程&#xff0c;有效管理和库存固定资产&#xff0c;进一步提高企业实物资产管理和库存效率。 包括资产申购、验收…

【操作系统】计算机大脑CPU

1.CPU组成机构和存储器层级 &#xff08;1&#xff09;CPU是计算机硬件系统的核心部件-大脑 结构&#xff1a;运算器控制器&#xff08;两个部件里面有寄存器组&#xff09;通过CPU内部的总线进行通信 &#xff08;2&#xff09;单核CPU架构 控制器Control Unit简称【CU】 …

Python使用Opencv图像处理方法完成手势识别(二)

Opencv完成手势识别根据坐标识别寻找最低点计算其他点与最低点的距离通过距离阈值判断手指根数和手势效果展现完整代码当我们把手近似出来后会得到一组轮廓的点坐标&#xff0c;我自己手势识别的思路就是根据点坐标来判断手势。根据坐标识别 寻找最低点 所谓寻找最低点&#…

浅谈Nacos注册中心集群分布式架构设计

前言 Nacos的压测性能是非常好的&#xff0c;这里是Nacos官方的压测报告。3节点(CPU 16核&#xff0c;内存32G)规模集群&#xff0c;压测容量服务数可达60W&#xff0c;实例注册数达110W&#xff0c;集群运行持续稳定&#xff0c;达到预期&#xff1b;注册/查询实例TPS达到 13…

ModStartBlog v6.3.0 任务调度重构,UEditor 升级

系统介绍 ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键…

跨设备链路聚合 M-LAG

M-LAG&#xff08;Multichassis Link Aggregation Group&#xff09;即跨设备链路聚合组&#xff0c;是一种实现跨设备链路聚合的机制&#xff0c;如下图所示&#xff0c;将SwitchA和SwitchB通过peer-link链路连接并以同一个状态和Switch进行链路聚合协商&#xff0c;从而把链路…

学校介绍静态HTML网页设计作品 DIV布局学校官网模板代码 DW大学网站制作成品下载 HTML5期末大作业

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

iOS app上架app store流程详解​

前提条件​ 在有效期内的苹果开发者账号&#xff08;类型为个人或者公司账号&#xff09;。还有一种情况&#xff0c;就是你的Apple ID被添加到公司开发者账号团队里面&#xff0c;这样也是可以的&#xff0c;但是需要叫管理员给你开通相应的账号权限&#xff0c;如下截图&…

[附源码]Python计算机毕业设计Django在线图书销售系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

Vue | 有关Vue2路由知识点的一些总结,以及Vue3路由做出了哪些调整?

目录 Vue2: 1. 路由&#xff1a; 2. 路由规则&#xff1a; 3. 实现切换&#xff08;active-class可配置高亮样式&#xff09; 4. 指定展示位置 5. 路由的query参数 6. params传参&#xff1a; 7. 多级路由 8. 路由的props配置 9. 的replace属性 10. 编…

Android databinding之BindingMethod与BindingMethods介绍与使用(五)

一、介绍 前面几篇文章已介绍了很多data binding的用法&#xff0c;今天我将会介绍一个新的方法绑定BindingMethod的用法。 BindingMethod&#xff0c;从名字可以看出是绑定方法的&#xff0c;绑定的一般都是和布局有关&#xff0c;通过绑定来提高布局可扩展性。 二、使用 Bin…

把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10

就像黑火药时代里突然诞生的核弹一样&#xff0c;OpenAI的ChatGPT语言模型的横空出世&#xff0c;是人工智能技术发展史上的一个重要里程碑。这是一款无与伦比、超凡绝伦的模型&#xff0c;能够进行自然语言推理和对话&#xff0c;并且具有出色的语言生成能力。 好吧&#xff…

资产扫描神器ARL增强改造

拉取项目首先从GitHub克隆到服务器上。git clone https://github.com/ki9mu/ARL-plus-docker/修改配置文件因为ARL在配置文件里设置了黑名单&#xff0c;有时候项目为GOV或者EDU之类的时候无法进行扫描&#xff0c;所以在这里修改一下配置文件就可以解除限制。cd ARL-plus-dock…

Spring Boot3.0 GA系列全新版本-全新体验-学习案例1

SpringBoot3.0 GA 2022-11-24这是伟大的一天&#xff0c;Spring Boot进入了3.0时代&#xff0c;并会叩开JDK全面升级的浪潮 文章目录SpringBoot3.0 GA技术支持一、新建第一个mode&#xff1f;1.1、打开IDEA&#xff0c;新建项目1.2、选择 版本 和 依赖1.3、查看项目结构1.4、配…

vscode配置remote ssh

1. 安装插件 设置界面 右键最左边tab栏&#xff1a; 主体: vscode 插件: Remote SSH Linux主体: vscode-server 插件: C/C, CMake, CMake Tools, CodeLLDB, Rainbow Brackets, vscode-proto3, SVN 虚拟化主体: multipass linux发行版(比如ubuntu) 补充: multipass实例本地端口…

【C++ unordered_set set 和 unordered_map 和 map】

文章目录前言简单介绍哈希表&#xff0c;哈希结构什么时候用哈希表unordered_map操作likou第一题 两数之和unordered_set 基础操作unordered_set 实现总结前言 今天重新打开力扣&#xff0c;看到以前的签到题两数之和&#xff0c;以前的方法是双指针暴力解法&#xff0c;偶然看…

asp.net校园二手物品交易网站

目录 摘 要 Ⅰ Abstract Ⅱ 第一章 概述 1 1.1网站的开发背景 1 1.1.1学生二手物品交易置换网站的开发背景 1 1.1.2学生二手物品交易活动的现状 1 1.2 学生二手物品交易置换网站的研究方向和内容 2 1.2.1研究方向 2 1.2.2研究内容 2 1.3 学生二手物品交易置换网站的设计目标 2…

transformer中QKV的通俗理解(剩女与备胎的故事)

用vit的时候读了一下transformer的思想,前几天面试结束之后发现对QKV又有点忘记了, 写一篇文章来记录一下 参考链接: 哔哩哔哩:在线激情讲解transformer&Attention注意力机制&#xff08;上&#xff09;在线激情讲解transformer&Attention注意力机制&#xff08;上&…