「C++」类和对象(1)

欢迎来到海盗猫鸥的博客~~
本篇我们将学习部分C++中的类和对象相关知识沃~


(´• ω •`)ノ算我一个~


目录

类的定义

类的定义及使用

访问限定符

类域

实例化

实例化概念:

对象大小:

内存对齐规则:

注意点:

this指针

结语


类的定义

类的定义及使用

  • class为类的关键字,后接类的名字,同命名空间一样使用{}来限定主体内容,且限定的范围也是一个域,但不同于命名空间,类的最后要加上分号结尾;

    class hdmo
    {//声明成员变量(属性)、函数(方法)等//...//...
    };
    
  • 类中的内容为类的成员:类中的变量称为类的属性或者成员变量;类中的函数称为类的方法或者成员函数。

  • 类中的函数默认为inline内联函数,可以将函~数的定义和声明分开,使其成为普通函数,但需要在函数定义的地方加上函数所属的类域:

    class hdmo
    {
    public://访问限定符int y = 10;void Fun(int x = 10);
    };
    void hdmo::Fun(int x)
    {std::cout << (x + y) << std::endl;
    }
    int main()
    {hdmo a;//不同于命名空间,要使用类里的函数,需要先创建一个类a.Fun();return 0;
    }
    
  • 在C++中struct也可以用于定义类,在升级了其功能的同时,也兼容C语言中的用法;即在C++中struct中也可以定义函数。

    //C++中写法
    struct ListNode
    {int val;ListNode* next;
    };
    //C中写法
    struct ListNode
    {int val;struct ListNode* next;
    };
    

    在C语言中,由于struct仅为结构体的关键字,若要直接使用ListNode作为结构体类型,就必须借助typedef来重命名,但C++中,ListNode可以直接作为类的类型名,此处ListNode既可以说是一个类,也可以说是一个结构体。

访问限定符

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

  • public关键字为公开,其修饰的成员在类的外部也可以直接被访问;protectedprivate修饰的成员在类外不能直接被访问,两者暂时理解为相同的意思,即为私密的。
  • 访问限定符的作用域是从当前限定符开始,直到下一个限定符之前,若类中没有下一个访问限定符,则直接作用到‘ } ’类结束。
  • class修饰的类,在没有使用访问限定符前默认的访问权限为private,而struct修饰的类,默认为public

类域

类实际上也是定义了一个全新的作用域。类的所有成员都在类的作用域中,在类外部使用时都需要::来指名其所属的域,这和namespace命名空间有着一定的相似处。

当不指名成员所属的域时,默认就只会在全局作用域和当前作用域查找,若查找不到将会报错。

实例化

实例化概念:

使用类类型在物理内存中创建对象的过程,称为类实例化出对象

  • 类和结构体类似,在没有创建实体之前是不能直接使用其中的成员的,类就好比一个模板,规定了类中有那些成员,但也仅仅是声明了而已,并没有为其分配空间,只有实际创建了一个对象,即实例化出对象后,才会分配空间

  • 一个类可以实例化出多个对象,就如一个结构体类型可以创建多个结构体变量一样,类就好比蓝图,一个图纸可以创建多个实体对象。
    在这里插入图片描述

#include <iostream>
using namespace std;
class hdmo
{
public:void Print(){cout << _a << endl;}void Init(const int& x){_a = x;}
private:int _a;
};
int main()
{//hdmo::Print();//错误使用,区别于命名空间中的函数hdmo h1;//创建实例h1h1.Init(30);h1.Print();hdmo h2;//创建实例h2h2.Init(20);h2.Print();return 0;
}

对象大小:

和结构体一样,类创建的实例对象中包含了各种成员,但类中还包含了成员函数;每个实例化对象,都有自己的成员变量,他们是分别独立的,但成员函数呢?

无论是哪一个对象,在调用函数时,其使用的成员函数都必定是一样的,那么这还有必要在每一个对象中都放一个相同的函数吗?显然,是没有必要的,而且这样还会产生空间的浪费,如果有100个对象,就会产生100个相同的成员函数,造成空间的大量浪费。

成员函数在存储时会放在一个公共的代码区域,这样就只需要存储一份。

成员变量就和结构体中的成员变量一样,通过内存对齐的方式存储在对象中,而C++中的内存对齐和C语言是一模一样的

内存对齐规则:

  1. 第一个成员放在偏移量为0的地址处;
  2. 其他成员变量要对齐到自身对齐数的整数倍的地址处;
  3. 对齐数 = 编译器默认对齐数 与 成员变量类型大小 取较小值;
  4. VS环境下默认对齐数为8;
  5. 对象(结构体)总体大小:成员中最大对其数(若最大对齐数超过默认值,则取默认值)的整数倍;
  6. 若嵌套了其他类的对象,则嵌套的类对象的对齐数为自身成员中的最大对齐数(相当于将嵌套的对象中的成员展开后对齐)

注意点:

#include <iostream>
using namespace std;
class hdmo1
{};class hdmo2
{void Print(){cout << "Printf" << endl;}
};int main()
{hdmo1 h1;hdmo2 h2;cout << sizeof(h1) << endl;//1cout << sizeof(h2) << endl;//1return 0;
}

类为空,或者只包含成员函数时,此时用该类创建对象,对象的大小为1字节,用于表示对象的存在。

this指针

当我们使用类时,我们知道类创建对象后,对象的成员变量和成员函数是分开存储的,只有成员变量存储在对象中,而成员函数存储在其他地方并且函数体中没有关于不同对象的区分,那么,我们每次用不同的对象去调用相同的函数时,函数是如何知道应该访问的是d1对象还是d2对象呢?

以上问题,其实是C++中隐含了一个this指针来解决的。

演示代码(图中注释为真实原型,详见下文):

#include <iostream>
using namespace std;
class hdmo
{
public://void Init(hdmo* const this,int year, int month, int day)void Init(int year, int month, int day){_year = year;//this->_year = year;this->_month = month;this->_day = day;}//void Print(hdmo* const this)void Print(){cout << _year << "." << _month << "." << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{hdmo h1;//h1.Init(&h1, 2024, 7, 16);h1.Init(2024, 7, 16);//h1.Print(&h1);h1.Print();hdmo h2;h2.Init(2024, 7, 17);h2.Print();
}
  • 在编译器编译后,类中的成员函数会默认在形参的第一个位置,添加一个当前类类型的指针,指针的名字为this;所以上述成员函数的真实原型为void
    Init(hdmo* const this,int year, int month, int day)
    以及void
    Print(hdmo* const this)

  • 在调用类的成员函数时,每次调用编译器会自动将调用的对象地址传到函数,this就是用于接收指定对象的地址的,成员函数中使用的成员变量实际上也是通过this指针找到的,即Init的赋值语句真实原型为this->_year
    = year;this->_month;this->_day = day;

  • C++中在日常使用时,规定this指针是由编译器编译时自动添加的,不能显示的写出来,但是在可以函数内部显示的使用this指针。


结语

本篇关于类和对象的学习介绍就先到这里了,本篇主要带领大家初始类和对象,在之后的博客中我们会再深入的讲解相关的知识,欢迎大家再来学习。

个人主页:海盗猫鸥-CSDN博客

本期专栏:C++_海盗猫鸥的博客-CSDN博客

那么本期就到这里,有不足或不正确的地方欢迎大家指出,大家早点休息,我们下篇博客再见——
~~O(∩_∩)O~~在这里插入图片描述

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

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

相关文章

十二.核心动画 - 动画缓冲①(框架提供的缓存函数)

引言 上一篇博客我们已经讨论了Core Animation中时间的处理&#xff0c;以及CAMediaTiming协议。本篇博客我们就来看一下另外一个和时间有关的机制--缓冲。 缓冲会让动画看起来更平滑更自然&#xff0c;我们在本篇博客将会体验一下CAAnimation提供的缓存函数&#xff0c;UIVi…

TCP vs UDP:网络编程的双刃剑艺术

在浩瀚的网络编程世界里&#xff0c;TCP&#xff08;传输控制协议&#xff09;与UDP&#xff08;用户数据报协议&#xff09;如同两位性格迥异的剑客&#xff0c;各自以其独特的剑法与风格&#xff0c;在网络通信的舞台上独领风骚。今天&#xff0c;就让我们深入探索这两位网络…

【DevOps系列】DevOps简介及基础环境安装

作者&#xff1a;后端小肥肠 目录 1. 前言 2. DevOps&#xff08;详细介绍&#xff09; 3. Code阶段工具 3.1 Git安装 3.2 GitLab安装 4. Build阶段工具 5. Operate阶段工具 5.1 Docker安装 5.2 Docker-Compose安装 6. Integrate工具 6.1 Jenkins介绍 6.2 Jenkins安…

Axure中继器入门:打造你的动态原型

前言 中继器 是 Axure 中的一个高级功能&#xff0c;它能够在静态页面上模拟后台数据交互的操作&#xff0c;如增加、删除、修改和查询数据&#xff0c;尽管它不具备真实数据存储能力。 中继器就像是一个临时的数据库&#xff0c;为我们在设计原型时提供动态数据管理的体验&a…

Java二十三种设计模式-抽象工厂模式(3/23)

抽象工厂模式&#xff1a;复杂系统的灵活构建者 引言 在软件开发中&#xff0c;抽象工厂模式是一种提供接口以创建相关或依赖对象族的创建型设计模式。这种模式允许客户端使用一个共同的接口来创建不同的产品族&#xff0c;而无需指定具体类。 基础知识&#xff0c;java设计模…

Redis Cluster集群搭建只能正常启动一个怎么解决

Redis Cluster集群搭建只能正常启动一个怎么解决 建立redis集群时不小心就遇到了这问题 上图看 这两个都没有问题 接下来这个就出现问题啦 6380没有cluster集群 这个就是连不上 配置文件没错 看了几遍了 那该怎么办&#xff1f; 明明都一样的配置文件&#xff0c;为啥这…

成都亚恒丰创教育科技有限公司 【插画猴子:笔尖下的灵动世界】

在浩瀚的艺术海洋中&#xff0c;每一种创作形式都是人类情感与想象力的独特表达。而插画&#xff0c;作为这一广阔领域中的璀璨明珠&#xff0c;以其独特的视觉语言和丰富的叙事能力&#xff0c;构建了一个又一个令人遐想连篇的梦幻空间。成都亚恒丰创教育科技有限公司 在众多插…

解析DDD中的聚合对象

对象这个词对我们而言并不陌生。以最常见的面向对象为例&#xff0c;软件系统中的任何事物都被认为是一种对象。而针对如何设计和实现这些对象&#xff0c;也存在一批开发模式。例如&#xff0c;一种传统的做法是从数据的角度来规划对象的组织形式&#xff0c;先设计数据库模型…

甲骨文面试题【动态规划】力扣377.组合总和IV

给你一个由 不同 整数组成的数组 nums &#xff0c;和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。 题目数据保证答案符合 32 位整数范围。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3], target 4 输出&#xff1a;7 解释&#x…

QTableView仿Excel表头排序和筛选

一.效果 Excel的排序和筛选弹窗如下所示 功能非常强大。不仅支持内容排序和筛选,还支持颜色的排序和筛选,而且还支持设置多种过滤条件。本文只仿最常用的内容排序和内容单过滤条件的筛选,效果如下所示。 从效果图中可以看出,表头Section中的按钮有下列六种状态 enum Butt…

Redis 教程:从入门到入坑

目录 1. Redis 安装与启动1.1. 安装 Redis1.1.1. 在Linux上安装1.1.2. 在Windows上安装 1.2. 启动 Redis1.2.1. 在Linux上启动1.2.2. 在Windows上启动 1.3. 连接Redis1.3.1. 连接本地Redis1.3.2. 连接远程Redis1.3.2.1. 服务器开放端口1.3.2.2. 关闭防火墙1.3.2.3. 修改配置文件…

GESP CCF C++ 三级认证真题 2024年6月

第 1 题 小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级&#xff0c;那他可以选择的认证语言有&#xff08;&#xff09;种。 A. 1 B. 2 C. 3 D. 4 第 2 题 下面流程图在yr输入2024时&#xff0c;可以判定yr代表闰年&#xff0c;并输出 2月是29天 &#x…

【整体介绍】HTML和JS编写多用户VR应用程序的框架

一、Networked-Aframe是什么&#xff1f; 简称NAF&#xff0c;底层基于Mozilla的AFrame框架&#xff0c;用HTML和JS编写多用户VR应用程序的框架。 二、特性 支持 WebRTC 和/或 WebSocket 连接。 语音聊天。音频流让您的用户在应用程序内交谈&#xff08;仅限 WebRTC&#xff…

AV1技术学习: Compound Prediction

一、双向 Compound Prediction AV1支持两个参考帧的预测通过多种复合模式线性组合。复合预测公式为 其中&#xff0c;权重m(x, y) is scaled by 64 以进行整数计算&#xff0c;R1(x, y)和R2(x, y)表示两个参考块中位于(x, y)的像素。P(x, y)将按比例缩小 1/64 以形成最终的预测…

Android安卓使用MQTT(JAVA)

一、app目录下添加 implementation org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0 1) 点击Sync Now更新依赖 2) AndroidManifest.xml文件添加网络权限 <uses-permission android:name"android.permission.INTERNET"/> 二、 使用 1) 创建MqttConn…

使用 ABBYY FineReader PDF 15 在创建或转换 PDF 时自动生成书签

使用 ABBYY 为 PDF 文件添加书签&#xff0c;可以帮助快速定位文档中的主要内容&#xff0c;也能更方便的梳理出一份文档大纲。 有很多 PDF 文件在创建时并没有编辑书签&#xff0c;这里介绍使用 ABBYY FineReader PDF 15&#xff08;Win 系统&#xff09;在 PDF 中自动添加书…

postMessageXss续2

原文地址如下:https://research.securitum.com/art-of-bug-bounty-a-way-from-js-file-analysis-to-xss/ 在19年我写了一篇文章&#xff0c;是基于postMessageXss漏洞的入门教学:https://www.cnblogs.com/piaomiaohongchen/p/14727871.html 这几天浏览mXss技术的时候&#xff…

第三周周三总结

1.给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&#xff1a; 输…

RuoYi-后端管理项目入门篇1

目录 前提准备 下载若依前后端 Gitee 地址 准备环境 后端数据库导入 1 克隆完成 若依后端管理后端 Gitte 地址 :若依/RuoYi-Vue 2.1 创建Data Source数据源 2.2 填写好对应的数据库User 和 Password 点击Apply 2.3 新建一个Schema 2.4 填写对应数据库名称 这边演示写的…

【I²C协议】STC89C51单片机IIC通信(代码+原理)

STC89C51单片机IIC通信 什么是IC协议特点构成 通信协议开始信号、结束信号、应答信号数据传输 代码示例 什么是IC协议 IIC,即IC&#xff0c;全称 Inter-Integrated Circuit&#xff0c;字面上的意思是集成电路之间&#xff0c;它其实是IC Bus简称&#xff0c;所以中文应该叫 集…