类和对象(上)--类、类的实例化(对象)、this指针

1.类

1.1定位:

和namespace一样,类也有类域。同样起到既保护又限制的功能。别人不能随意访问类里的东西,得通过特定的方式来访问(访问方法和命名空间域一样,三种方法)。

1.2作用

在C语言中,struct代表结构体,用来放一些结构的基本参数(顺序表:数组、有效数据个数、容量大小;链表:数据域、指针域)。但是在C++中,struct得到了加强,升级版的名字叫class(类)/struct(类),里面不仅能够放基本参数,也能放一些基本函数。(为了区分C和C++,C++一般用class,不过用struct也是可以的。)

#include <iostream>
using namespace std;

//C语言
struct Stack {
	int* a;
	int size;
	int capacity;
};	

//C++

//两者在C++都一样,但是为了与C的struct区别,C++用class
//struct Stack{  };  calss Stack{  };
 
class Stack 
{
	//以下内容,都叫类的成员

	//类的成员函数
	void Init(int n = 4) {
		a = (int*)malloc(sizeof(int) * n);
		top = 0;
		capacity = n;
	}
	void Push() {
		//...
	}
		

	//类的成员变量
	int* a;
	int capacity;
	int top;
};

1.3定义:

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

1.4与C中struct的区别

第一点:class能在里面定义或者声明函数。C中struct不行。

第二点:class中类的名字能代表类型。C不行,类型表示必须类型+名字。(C中匿名结构体就不说了,使用的情况太少了)

// C 类型+名字=变量
struct Stack st;

//C中匿名结构体
strucr st;

// C++ 名字=变量
Stack st;

第三点:class成员变量同样要内存对齐,这点和C一致。内存对齐是为了方便硬件读取数据。(这里就是我们今天要了解的第二大点 ‘ 类的实例化 ’ )

第四点:class有访问限定符。C语言没有。

访问限定符是什么,通俗的说,对于一块儿空间,对它的访问限制更强。有些外面能指定就能访问;有些即是指定,也无法访问。

访问限定符有三种

public:成员在类外可以直接被访问
protected:成员在类外不能直接被访问(在继承中才能与private区别开)
private:成员在类外不能直接被访问

注:class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

在C++中,我们可以对特定成员加上访问限定符。这就有一个问题,访问限定符的作用范围是从哪到哪?

作用范围:访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有 访问限定符,作⽤域就到}即类结束。

2.类的实例化(对象)

1.1概念:

就是类的定义。类就像设计图,类的实例化是根据设计图造实物。

想清楚什么叫 ‘ 定义 ’ 。定义就是在内存中开空间。如果没有开空间,就是没定义。

1.2内存对齐:

在类的1.4中第三点,我们简单了解到内存对齐。这里在详细说一下内存对齐的规则

  • 第⼀个成员在与结构体偏移量为0的地址处。
  • 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。
  • 对⻬数=编译器默认的⼀个对⻬数与该成员⼤⼩的较⼩值。(VS默认为8)(如何修改VS默认值?)
  • 结构体总⼤⼩为:最⼤对⻬数( min{所有变量类型最⼤者,默认对⻬参数} )的整数倍。
  • 如果嵌套了结构体的情况,嵌套的结构体对⻬到⾃⼰的最⼤对⻬数的整数倍处,结构体的整体⼤⼩ 就是所有最⼤对⻬数(含嵌套结构体的对⻬数)的整数倍。

思考:为什么要内存对齐?

因为计算机硬件设计是32根数据线。也就是说,计算机每次读一次数据,都是4B 4B 的读。如果一个是char类型,一个是int类型。第一次读char的一个字节+int的前三个字节。第二次读int的最后一个字节+剩下的三个字节,就会发生越界访问,会出现随机值。为了避免此情况,所以要设置内存对齐。

1.3类的所有成员,都需要实例化么?

我们在上面的图片可以看到。在sizeof(st)时,输出是16。但是新问题是,为什么只有16?成员函数如果不算,那么16好解释。然而事实是什么?

事实就是如此,在计算类的大小时,只计算成员变量(这点和C的struct一样),成员函数不计算。

那么成员函数的空间,定义在哪了?现在我也不不太明白。只知道成员函数在公共代码段。仔细想一下,如果类实例化很多次,虽然成员变量可能不一样,但是成员函数肯定一样啊。如果成员函数也是跟着再开空间,那空间就会浪费太多。

1.4类的实例化,最小为多少?

因为如果⼀个字节都不给,怎么表⽰对象存在过呢?所以这⾥给1字节,纯粹是为了占位标识 对象存在。

3.this指针

3.1作用:

分清哪个对象在调用成员函数

d1和d2都调用Print,那么为什么结果不一致呢?

这就是this指针的作用了:编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类 类型的指针,叫做this 指针。⽐如Date类的Init的真实原型为, void Init(Date* const this, int year, int month)

注:为了区别成员变量,习惯上成员变量会加⼀个特殊标识

3.2定义:

类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值, this->_year = year;

注:this指针,只指向成员变量,不指向成员函数。

3.3使用

C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显 ⽰使⽤this指针。

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

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

相关文章

Leetcode 路径总和

使用递归算法 class Solution {public boolean hasPathSum(TreeNode root, int targetSum) {// 如果节点为空&#xff0c;返回falseif (root null) {return false;}// 如果是叶子节点&#xff0c;检查路径和是否等于目标值if (root.left null && root.right null) …

程序里sendStringParametersAsUnicode=true的配置导致sql server cpu使用率高问题处理

一 问题描述 近期生产环境几台sql server从库cpu使用率总是打满&#xff0c;发现抓的带变量值的慢sql&#xff0c;手动代入变量值执行并不慢&#xff0c;秒级返回&#xff0c;不知道问题出在哪里。 二 问题排查 用扩展事件或者sql profiler抓慢sql&#xff0c;抓到了变量值&…

传输层协议TCP

一.TCP协议格式 对于传输层协议我们之前是学过了UDP&#xff0c;对于传输层协议是存在了一定的了解的&#xff0c;所以现在我们再来看TCP协议格式&#xff1a; 我们之前学过UDP的报文格式&#xff0c;所以源端口和目的端口是不需要进行再次讲解的&#xff0c;对于32序号和确认序…

学习笔记024——Ubuntu 安装 Redis遇到相关问题

目录 1、更新APT存储库缓存&#xff1a; 2、apt安装Redis&#xff1a; 3、如何查看检查 Redis版本&#xff1a; 4、配置文件相关设置&#xff1a; 5、重启服务&#xff0c;配置生效&#xff1a; 6、查看服务状态&#xff1a; 1、更新APT存储库缓存&#xff1a; sudo apt…

C++为函数提供的型特性——缺省参数与函数重载

目录 一、缺省参数 二、函数重载 一、缺省参数 C为函数提供了一项新的特性——缺省参数。缺省参数指的是当前函数调用中省略了实参自动使用的一个值。这极大地提高了函数的灵活性 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值 。在调⽤该函数时&#xff0c;如果没有…

前端框架Vue3基础部分

什么是Vue&#xff1f; Vue是一个能用于构建用户交互页面&#xff08;动态网页&#xff09;的渐进式JavaScript框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用性强的Web前端框架。 Vue的设计模式&#xff1f; Vue的设计模式&#xff1a;MVVM模式 MVVM设计模…

安达发|APS自动排程软件异常预警处理场景介绍

APS生产排单软件通过预先设定好相关基本资料与约束规则&#xff0c;当订单、机台、工具、材料、上下班时间等任何影响生产计划的因素变化后&#xff0c;只需执行“一键式排程计算”&#xff0c;系统即可生成相应的生产计划。它不仅能够高效地安排生产任务&#xff0c;优化资源分…

在阿里云快速启动Appsmith搭建前端页面

什么是Appsmith Appsmith是一个开源的低代码开发平台&#xff0c;它使得开发者能够快速地构建内部工具、业务管理系统、CRM系统等。Appsmith通过提供一系列预建的UI组件&#xff08;如表格、图表、表单等&#xff09;&#xff0c;以及对数据库、API调用的直接支持&#xff0c;…

命令执行简单(棱角社区有毒)

前言&#xff1a;小迪安全2022第一节反弹shell&#xff0c;小迪用的是两台都是云服务器&#xff0c;没有服务器可以在自己的主机上搭建也是可以的&#xff0c;主机上搭两个网站 思路&#xff1a;生成一个木马文件&#xff0c;下载到本机&#xff0c;然后利用本机上传到目标主机…

基于Ruoyi的同一token跨系统访问,后端单点登录并且鉴权方案

基于Ruoyi的同一token跨系统访问,后端单点登录并且鉴权方案 需求场景以及先决条件默认方案改造思路改造代码,一共4个类需要变更完整需要修改的代码 需求场景以及先决条件 同一环境下的多个ruoyi项目,各自使用相同的一组用户(我这里用的是LDAP的登录,不影响本文),但是每个权限拥…

图像/文字差异类型验证码识别 无需训练

某像差异在个别全家桶验证方便有使用&#xff0c;对于这种验证码类型如下&#xff1a; 首先还是目标检测&#xff0c;直接用 dddd 自带的detection 就足够了。 特征提取 其次经过观察&#xff0c;差异答案与其他三个无非就是颜色&#xff0c;字体&#xff0c;方向&#xff0c…

【AI+教育】一些记录@2024.11.16

《万字长文&#xff0c;探讨关于ChatGPT的五个最核心问题》 万字长文&#xff0c;探讨关于ChatGPT的五个最核心问题关于 ChatGPT 铺天盖地的信息让人无所适从。本文则试图提炼出五个关键问题&#xff1a;如何理解这次范式突破&#xff0c;未来能达到的技术天花板&#xff0c;行…

Java-04 深入浅出 MyBatis - SqlSessionFactory 与 SqlSession DAO与Mapper 代理模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

在Unity中使用Epplus写Excel

Overview 本文旨在帮助你快速入门,该库发展多年内容庞大(官方文档写的极好:https://github.com/EPPlusSoftware/EPPlus/wiki),有些功能在Unity环境可能你永远都不会使用. 官方的一个Demo: https://github.com/EPPlusSoftware/EPPlus.Samples.CSharp 如果你只有读的需求,可以…

leetcode 删除有序数组的重复项

26. 删除有序数组中的重复项 已解答 简单 相关标签 相关企业 提示 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 n…

HNUST-党校培训自动下一集油猴脚本

1.起初 好烦&#xff0c;这个系统看视频需要一直点按键&#xff0c;还没有自动下一集的功能&#xff0c;于是就有了这个js代码 2.效果 实现自动点击是否观看&#xff0c;检测按键自动播放下一集 3.代码(你需要下载油猴&#xff0c;打开管理面板&#xff0c;新建代码) // UserS…

深入了解 GIS 地理信息系统和前端五大 GIS 技术,GIS地理信息系统介绍及前端五大 GIS 技术解析

目录 前言 地理信息系统 (GIS) 是现代数据化社会的重要工具&#xff0c;广泛应用于智慧城市、环境保护、交通管理等领域。随着 Web 前端技术的发展&#xff0c;GIS 可视化在浏览器端的表现能力越来越强&#xff0c;成为许多开发者关注的焦点。这里分享记录 GIS 的基础知识&am…

美团单车上线暖手套,美团贴心服务会给市场带来什么?

首先&#xff0c;美团单车上线暖手套这一举措主要是为了提升市民在秋冬季节骑行共享单车、电单车的出行体验。这一贴心的设计能够解决骑行者在寒冷天气中手部受冻的问题&#xff0c;使得骑行更加舒适和安全。 其次&#xff0c;美团的这一贴心服务会对市场产生积极影响。一方面…

Mysql-DQL语句

文章目录 DQL 语句简单查询查询表所有数据查询指定列 别名查询清除重复值查询结果参与运算 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Mysql专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月16日11点39分 DQL 语句 DQL 语句数据…

【cpp中的继承】

什么是继承&#xff1f; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&…