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

news2024/9/24 3:24:12

欢迎来到海盗猫鸥的博客~~
本篇我们将学习部分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;//创建实例h1
	h1.Init(30);
	h1.Print();

	hdmo h2;//创建实例h2
	h2.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;//1
	cout << sizeof(h2) << endl;//1
	return 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://www.coloradmin.cn/o/1932265.html

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

相关文章

卸载docker简单且ok的方法

杀死所有容器 docker kill $(docker ps -a -q) 删除所有容器 docker rm $(docker ps -a -q) 删除所有镜像 docker rmi $(docker images -q) 停止docker服务 systemctl stop docker 查看安装列表 yum list installed|grep docker 依次卸载已安装的docker yum -y remove docke…

入职前回顾一下git-01

git安装 Linux上安装git 在linux上建议用二进制的方式来安装git&#xff0c;可以使用发行版包含的基础软件包管理工具来安装。 红帽系 sudo yum install gitDebian系 sudo apt install gitWindows上安装git 去官网下载和操作系统位数相同的安装包.或者可以直接安装GitHub…

【C++】类和对象·this指针

C中的类与C语言中的结构体有很多的相似的地方&#xff0c;可以说本质上除了结构体只能定义成员变量&#xff0c;以及结构体默认的访问控制权限是public之外与class没啥区别。但是结构体变量每次调用函数的时候需要指针&#xff0c;而类中的成员函数明明被保存在公共代码段&…

SCI一区级 | Matlab实现SSA-CNN-GRU-Multihead-Attention多变量时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现SSA-CNN-GRU-Multihead-Attention麻雀算法优化卷积门控循环单元融合多头注意力机制多变量时间序列预测&#xff0c;要求Matlab2023版以上&#xff1b; 2.输入多个特征&#xff0c;输出单个…

“深入JVM内部:揭秘Java程序运行的神秘黑盒“(二)

一.双亲委派模型(在加载环节) 简单描述了如何查找 .class 文件的策略. 概念&#xff1a;如果一个类加载器收到了类加载的请求&#xff0c;它首先不会自己去尝试加载这个类&#xff0c;而是把这个请求委派给父类加载器去完成&#xff0c;每一个层次的类加载器都是如此&#x…

C++ | Leetcode C++题解之第238题除自身以外数组的乘积

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int length nums.size();// L 和 R 分别表示左右两侧的乘积列表vector<int> L(length, 0), R(length, 0);vector<int> answer(l…

RK3568平台(文件系统篇)Buildroot文件系统

一.Buildroot文件系统概述 Buildroot 是Linux平台上一个开源的嵌入式Linux系统自动构建框架。整个Buildroot是由Makefile脚本和Kconfig配置文件构成的。可通过Buildroot配置&#xff0c;编译出一个完整的可以直接烧写到机器上运行的Linux系统软件。 获取buildroot官方源码&am…

人工智能 (AI) 应用:一个异常肺呼吸声辅助诊断系统

关键词&#xff1a;深度学习、肺癌、多标签、轻量级模型设计、异常肺音、音频分类 近年来&#xff0c;流感对人类的危害不断增加&#xff0c;COVID-19疾病的迅速传播加剧了这一问题&#xff0c;导致大多数患者因呼吸系统异常而死亡。在这次流行病爆发之前&#xff0c;呼吸系统…

【Vue3】4个比较重要的设计模式!!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 在我投身于前端开发的职业生涯期间,曾有一次承接了一个大型项目的维护工作。此项目运用的是 Vue 框架,然而其代码结构紊乱不堪,可维护性极度糟糕😫。 这使我深刻领会到,理解并运用 Vue 中的重要设计模式是何等关键! …

Codeforces Round 958 (Div. 2)(A~C)题

A. Split the Multiset 思路: 最优的策略是每次操作分出 k−1&#x1d458;−1 个 1&#xff0c;然后考虑最后是否会剩下一个单独的 1。 代码: #include<bits/stdc.h> using namespace std; #define N 1000005 typedef long long ll; typedef unsigned long long ull;…

VGMShield:揭秘视频生成模型滥用的检测与追踪技术

人工智能咨询培训老师叶梓 转载标明出处 视频生成模型&#xff0c;如 Stable Video Diffusion 和 Videocrafter&#xff0c;已经能够生成合理且高分辨率的视频。但这些技术进步也带来了被恶意利用的风险&#xff0c;比如用于制造假新闻或进行政治宣传。因此&#xff0c;来自弗…

BUUCTF逆向wp [HDCTF2019]Maze

第一步 查壳&#xff0c;本题是32位&#xff0c;有壳&#xff0c;进行脱壳。 第二步 这里的 jnz 指令会实现一个跳转&#xff0c;并且下面的0EC85D78Bh被标红了&#xff0c;应该是一个不存在的地址&#xff0c;这些东西就会导致IDA无法正常反汇编出原始代码&#xff0c;也称…

Kafka 高并发设计之数据压缩与批量消息处理

《Kafka 高性能架构设计 7 大秘诀》专栏第 6 章。 压缩&#xff0c;是一种用时间换空间的 trade-off 思想&#xff0c;用 CPU 的时间去换磁盘或者网络 I/O 传输量&#xff0c;用较小的 CPU 开销来换取更具性价比的磁盘占用和更少的网络 I/O 传输。 Kafka 是一个高吞吐量、可扩展…

python课设——宾馆管理系统

python课设——宾馆管理系统 数据库课设-宾馆管理系统-python3.7pyqt5 简介 大二数据库课程设计&#xff08;3-4天工作量&#xff09;的项目&#xff0c;登录界面的ui设计参考了他人成果&#xff0c;其余ui以及所有后端部分全部独立完成&#xff0c;详细功能见功能模块图使用…

国内新能源汽车芯片自给,承认差距,任重道远

【科技明说 &#xff5c; 科技热点关注】 据近日工信部电子五所元器件与材料研究院高级副院长罗道军表示&#xff0c;中国拥有最大的新能源车产能&#xff0c;芯片用量也是越来越多。但是芯片的自给率目前不到10%&#xff0c;是结构性的短缺。 中国拥有最大新能源车产能&#…

入门【消息队列】这一篇就够了

消息队列 消息队列的模型为什么要用消息队列分布式消息队列应用场景分布式消息队列选型RabbitMQ入门实战singleWorkFanoutDirectTopic核心特性消息过期机制消息确认机制死信队列消息队列的模型 生产者:Producer,发送消息的人(客户端) 消费者:Consumer,接受消息的人(客…

NLCISBNPlugin,从“中国国家图书馆”获取图书信息Calibre插件

NLCISBNPlugin可以从中国国家图书馆获取图书信息&#xff0c;包括 ISBN、书名、作者、出版日期等信息&#xff0c;然后将这些信息添加Calibre中。 插件安装:NLCISBNPlugin.zip 安装说明&#xff1a; 在 Calibre官方网站 上下载并安装Calibre。下载最新版本的 NLCISBNPlugin …

JUC 包中的 Atomic 原子类总结

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

RFID涉密载体管控系统|DW-S402功能介绍

文件载体管控系统DW-S402是用于对各种载体进行有效管理的智能柜&#xff08;智能管理系统&#xff09;&#xff0c;实现对载体的智能化、规范化、标准化管理&#xff0c;广泛应用于保密、机要单位以及企事业单位等有载体保管需求的行业。 区域监控管理 主要是通过在需要监控的…

el-table表格操作列错行处理

解决方法&#xff1a; <style>::v-deep .el-table th.el-table__cell > .cell {white-space: nowrap !important;} </style>