C++--类的实例化

一、实例化的概念

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

类是对对象进行一种抽象描述,是一个模型一样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,用类实例化出对象时,才会分配空间。

一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。

举个例子:类实例化出对象就像现实中使用建筑设计图建造出房子,类就是设计图,设计图并不是实体化的建筑,只有当使用设计图修建出房子后,这个房子才能住人。类同理,它不能存储数据,实例化出的对象分配物理内存数据。

class Data
{
public:void Print(int year, int month, int day){cout << year << "/" << month << "/" << day << endl;}private://此时并没有真正的开辟空间int _year;int _month;int _day;};
//在这里会输出12个字节的大小,原因是此时编译器在编译期间需要确定占据的空间大小
//并不是真正的开辟空间,只有当对对象进行实例化的时候才会开辟相对应的空间
void Print()
{cout << "sizeof(d): " << sizeof(Data) << endl;
}int main()
{Print();//在这里创建了Data d 这样的一个对象后Data类中的成员变量才是真正的开辟了空间Data d;cout << "sizeof(d): " << sizeof(d) << endl;d.Print(2024, 9, 14);return 0;
}

在 C++ 中,即使没有显式地对类的成员变量进行 “实例化”(初始化),但当定义类的对象时,依然会为对象分配内存空间以容纳类的成员变量。

在上述代码中,虽然没有显式地创建Data类的对象,但在Print函数中使用sizeof(Data)来获取Data类的大小,这并不意味着真正地为对象开辟了空间,只是在编译期确定这个类在内存中需要占据的空间大小。

类的大小取决于其成员变量的类型和布局,即使成员变量没有被初始化,它们在类的布局中仍然占据一定的空间,所以sizeof(Data)会返回一个非零的值,这并不代表实际开辟了对象的存储空间。只有在使用Data d;这样的语句创建类的对象时,才真正在运行时为对象分配内存空间。

二、对象大小

类实例化出的每个对象都有独立的数据空间,所以对象中包含成员变量。

函数在被编译后是一段指令,对象中没办法存储,所以一般情况下类的对象本身不直接包含函数指针。

同时C++中规定,类实例化的对象也要遵守内存对齐的规则。

class A
{
public:
private:char c;int i;
};class B{};class C{};int main()
{A a;B b;C c;cout << sizeof(a) << endl;cout << sizeof(b) << endl;cout << sizeof(c) << endl;
}

上述代码中A类根据内存对齐的规则应当是8个字节的数据,输出的是没有问题的;

但是B类 和 C类的1个字节是什么原因呢?

原因如下:给定一个字符作为占位符的存在,否则无法证明类的存在,这个字节的空间不存储任何数据,仅作为占位符的作用存在。

三、this指针

在C++中存在一个隐藏的this指针,他的作用就是在编译器对代码进行编译后,在函数的参数中默认调用这个指针,用于解决函数中对不同对象的区分。

我们来看下面这段代码:

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>
using namespace std;
class Date
{
public:// void Init(Date* const this, int year, int month, int day)void Init(int year, int month, int day){// 编译报错:error C2106: “=”: 左操作数必须为左值// this = nullptr;// this->_year = year;_year = year;this->_month = month;this->_day = day;}void Print(){cout << _year << "/" << _month << "/" << _day << endl;}
private:// 这⾥只是声明,没有开空间int _year;int _month;int _day;
};
int main()
{// Date类实例化出对象d1和d2Date d1;Date d2;// d1.Init(&d1, 2024, 3, 31);d1.Init(2024, 3, 31);d1.Print();d2.Init(2024, 7, 5);d2.Print();return 0;
}

在上述代码中Data类又Init和Print两个成员函数,函数体中的没有关于不同对象的区分,此时就是使用了this指针来解决的这个问题。

编译器将其编译后,类的成员函数默认会在形参的第一个位置,增加一个当前类类型得到指针,叫做this指针。

也就是说其原型是Data(Data* const this,int year,int month,int day);

类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给成员的赋值。

注意!C++中规定不能在实参和形参的的位置显示的写this指针,但是可以在函数体内显示使用this指针。

this指针的存放位置:内存中的栈区。

原因:this指针本身是函数的一个参数,而创建函数就会创建栈,当函数体销毁时,栈区也随之销毁,同时栈中的参数也会随之销毁,由此可见,this指针在内存中存放的位置是栈区。

四、C++和C语言实现Stack的区别

面向对象的三大特征:封装、继承、多态

区别:

1、C++中的数据和函数都放在了类里面,通过访问限定符进行了限制,不能再随意通过对象直接修改数据,这是C++封装的一种体现,这个是最重要的变化。

封装的本质就是一种更为严格规范的管理,避免出现乱访问修改数据的情况。

2、C++中有一些相对方便的语法,比如Init给的缺省参数会方便很对,成员函数每次不需要传对象地址,因为this指针隐含了传递,使用类型不再需要typedef来进行重定义,直接使用类名即可。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java项目之编程训练系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的编程训练系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 编程训练系统的主要使用者管…

【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)

文章目录 前言一、ArkTS基本介绍1、 ArkTS组成2、组件参数和属性2.1、区分参数和属性的含义2.2、父子组件嵌套 二、装饰器语法1.State2.Prop3.Link4.Watch5.Provide和Consume6.Observed和ObjectLink代码示例&#xff1a;示例1&#xff1a;&#xff08;不使用Observed和ObjectLi…

未来通信抢先看!遨游通讯2024年中国国际信息通信展亮点剧透

2024年中国国际信息通信展览会将于9月25日-27日在北京国家会议中心举行&#xff0c;本届展会以“推动数实深度融合&#xff0c;共筑新质生产力”为主题。在通信技术日新月异的今天&#xff0c;卫星通信、人工智能、低碳节能等技术理念正引领着通信行业迈向新的高度。遨游通讯作…

【漏洞复现】Casbin casdoor static 任意文件读取漏洞

漏洞描述 Casdoor 是 Casbin 开源社区推出的基于 OAuth 2.0 / OIDC 的中心化的单点登录(SSO)身份验证平台。 Casdoor static 存在任意文件读取漏洞,攻击者通过发送特殊的请求包可以获取服务器中的敏感文件。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵…

Linux C# DAY3

作业 1、 #!/bin/bash mkdir -p ~/dir/dir1 mkdir ~/dir/dir2 cp ./* ~/dir/dir1 cp ./*.sh ~/dir/dir2 cd ~/dir/ tar -cvJf dir2.tar.xz ./dir2 mv dir2.tar.xz ~/dir/dir1/ cd ~/dir/dir1/ tar -xvf dir2.tar.xz 2、 #!/bin/bash head -5 /etc/group | tail -1 sudo mkdi…

CORS漏洞及其防御措施:保护Web应用免受攻击

1. 背景- 什么是CORS&#xff1f; 在当今互联网时代&#xff0c;Web 应用程序的架构日益复杂。一个后端服务可能对应一个前端&#xff0c;也可能与多个前端进行交互。跨站资源共享&#xff08;CORS&#xff09;机制在这种复杂的架构中起着关键作用&#xff0c;但如果配置不当&…

Redis Key的过期策略

Redis 的过期策略主要是指管理和删除那些设定了过期时间的键&#xff0c;以确保内存的有效使用和数据的及时清理。 具体来说&#xff0c;Redis 有三种主要的过期策略&#xff1a;定期删除&#xff08;Scheduled Deletion&#xff09;、惰性删除&#xff08;Lazy Deletion&#…

鸿蒙Harmony-Next 徒手撸一个日历控件

本文将介绍如何使用鸿蒙Harmony-Next框架实现一个自定义的日历控件。我们将创建一个名为CalendarView的组件&#xff08;注意,这里不能叫 Calendar因为系统的日历叫这个&#xff09;,它具有以下功能: 显示当前月份的日历支持选择日期显示农历日期可以切换上一月和下一月 组件…

情感类智能体——你的微信女神

智能体名称&#xff1a;你的微信女神 链接&#xff1a;文心智能体平台AgentBuilder | 想象即现实 (baidu.com)https://agents.baidu.com/agent/preview/RulbsUjIGj4wsinydlBH7AR3NQKFungt 简介 “你的微信女神”是一个直率的智能体&#xff0c;她用犀利而真实的言辞帮助用户…

C++第十一节课 new和delete

一、new和delete操作自定义类型 new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数&#xff08;new会自动调用构造函数&#xff1b;delete会调用析构函数&#xff09; class A { public:A(int a 0): _a(a){cout <&l…

JAVAWeb--前端工程化

一、前端工程化开篇 1.1 什么是前端工程化 前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块化、组件化、规范化、自动化的问题,其主要目的为了提高效率和降低成本。 1.2 前端工程化实现技术栈 前端工程化实现的技术栈有很多,我们采用ES6nodejsnpmViteVUE3route…

【C++ Primer Plus习题】16.10

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> #include <string> #include <…

CefSharp_Vue交互(Element UI)_WinFormWeb应用(2)---置顶和取消置顶(含示例代码)

一、预览 获取winform的置顶参数,和设置置顶参数 1.1 置顶(默认不置顶) 1.2 示例代码

服务器——装新的CUDA版本的方法

服务器——装新的CUDA版本 一、进入 CUDA 版本列表二、根据自己服务器&#xff0c;选择对应的版本和配置三、使用管理员用户&#xff0c;运行下载和安装命令四、查看显卡驱动是否安装4.1 若安装了显卡驱动4.2 若显卡驱动没安装 参考文章 一、进入 CUDA 版本列表 CUDA Toolkit …

数字签名和CA数字证书的核心原理

看了蛋老师的视频就很容易理解了&#xff0c;首先对服务器的公钥和信息进行哈希运算得到一个短字符串&#xff0c;然后用CA机构中的私钥对这一短字符串进行加密就得到了一个数字签名&#xff0c;然后就这个数字签名放到数字证书中&#xff0c;同时服务器的公钥也放在数字证书中…

列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()

列表类型 一.Collections.sort() Collections.sort()用于List类型的排序&#xff0c;其提供了两个重载方法&#xff1a; 1.sort(List<T> list) &#xff08;1&#xff09;List指定泛型时只能指定引用数据类型&#xff0c;也就是说无法用于基本数据类型的排序。 &am…

云韧性,现代云服务不可或缺的组成部分

韧性&#xff0c;一个物理学概念&#xff0c;表示材料在变形或者破裂过程中吸收能量的能力。韧性越好&#xff0c;则发生脆性断裂的可能性越小。 如今&#xff0c;韧性也延伸到企业特质、产品特征等之中&#xff0c;用于形容企业、产品乃至服务的优劣。同样&#xff0c;随着云…

【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略

文章目录 C类与对象前言读者须知RVO 与 NRVO 的启用条件如何确认优化是否启用&#xff1f; 1. 按值传递与拷贝省略1.1 按值传递的概念1.2 示例代码1.3 按值传递的性能影响1.3.1 完全不优化 1.4 不同编译器下的优化表现1.4.1 Visual Studio 2019普通优化1.4.2 Visual Studio 202…

【C语言】⾃定义类型:联合和枚举

⾃定义类型&#xff1a;联合和枚举 1. 联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对⽐1.4 联合体⼤⼩的计算1.5 联合的⼀个练习 2. 枚举类型2.1 枚举类型的声明2.2 枚举类型的优点2.3 枚举类型的使⽤ 1. 联合体 1.1 联合体类型的声明 像结构体…

哪家宠物空气净化器性价比高?希喂、霍尼韦尔和范罗士测评分享

对于家里有宠物的家庭来说&#xff0c;浮毛和异味已经是一件让它们十分头疼的事情了&#xff0c;所以我们在选购宠物空气净化器的时候&#xff0c;总会纠结于哪个品牌性价比高这个问题。毕竟宠物空气净化器是家里的电器&#xff0c;使用年限长&#xff0c;选购时自然要慎重考虑…