Cpp03 — 类和对象、this指针

news2024/9/25 9:35:53

一、类和对象

类由两部分构成:1.成员变量2.成员函数

C++中的struct兼容C的所有用法,同时C++中把struct升级成类

注意:类中的成员函数和成员数据都是声明,不是定义

类里的函数不是存到了对象中,而是存在公共区域(代码段)

类有两种定义方式:

1. 声明和定义全部放在类体中(成员函数如果在类中定义,编译器可能会将其当成内联函数处理)

class Person
{
    public:
        void show()
        {
            cout << _name << " " << _sex << " " << _age << endl;
        }
    private:
        string _name;
        string _sex;
        int _age;
};

2. 声明放在.h文件中,类的定义放在.cpp文件中

//声明防在.h文件中
class Person
{
    public:
        void show();
    private:
        string _name;
        string _sex;
        int _age;
};
//定义放在类的实现文件中
void Person::show()
{
    cout << _name << " " << _sex << " " << _age << endl;
}

二、访问限定符

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

访问限定符有三种:public(公有)、protected(保护)、private(私有)

关于访问限定符的说明:

1.public修饰的成员在类外可以直接被访问

2.protected和private修饰的成员在类外不能直接被访问
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止
4. class的默认访问权限为private,struct为public(因为struct要兼容C)

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

三、类的实例化、类的大小

 每个类成员实例化后,都是独立的空间,有自己的成员变量,但是每个对象调用的成员函数,都是同一个。

类的成员函数是存储在公共代码段的,在编译链接时,根据函数名去公共代码区找到函数的地址,根据函数地址使用地址(call函数地址)

 这个程序的运行结果: 正常运行

因为show_id()是存在公共代码段的,编译链接时就找到了它的地址,调用它的地址了,所以是正常运行。

计算类的大小时,如果只有成员函数,则其大小是1,如果除了成员函数还有其他数据成员,则大小为数据成员内存对齐。 之所以大小是1,其不存储实际数据,只是标识对象存在。

 四、类成员函数中的this指针

C++给每个“非静态成员函数“增加了一个隐藏的this指针,让其指向当前对象,在成员函数体中所有成员变量的操作,都将通过该指针访问。

注意:实参、形参位置不能显示传递和接收this指针,但是可以在成员函数内部使用this指针

this指针的特性:

1.this指针的类型:类类型*const

2.只能在成员函数的内部使用

3.this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针

4.this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

那么:this指针存在哪里?this指针可以为空吗?

// 1.下面程序能编译通过吗?

// 2.下面程序会崩溃吗?在哪里崩溃

class A

{

public:

void PrintA()

{

cout<<_a<<endl;

}

void Show()

{

cout<<"Show()"<<endl;

}

private:

int _a;

};

int main()

{

A* p = nullptr;

p->PrintA();

p->Show();

}

p->PrintA();处会崩溃,因为其尝试访问成员变量_a,p指向nullptr,this指针对p这个空指针进行了解引用,产生了野指针问题,所以崩溃。

this指针是存在栈里的,因为它是一个形参

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

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

相关文章

8.7 PowerBI系列之DAX函数专题-排名逻辑的4种实现-rankx详解

需求 实现 1 度量值 序号1排名 rankx(all(成绩表),成绩表[scoreandname],sum(成绩表[scoreandname])) --按照组合列排序2 rankx稀疏排名 rankx(all(成绩表),成绩表[分数],sum(成绩表[分数]),desc,skip) 3 rankx稠密排名 switch(true(),hasonevalue(成绩表[姓名])&#xff…

CCD光斑图像质量分析仪的作用和工作原理

激光光斑的成型在激光加工中起着至关重要的作用&#xff0c;在实际加工中激光可以被变换成各种形状以满足加工需求&#xff0c;激光光斑的形状大致可以被分为四种&#xff1a;矩形、环形、椭圆形、线形。矩形的激光光斑适用于激光切割、激光焊接&#xff0c;环形的激光光斑适用…

契约测试之 - 使用Pact-JS编写契约测试

契约测试是一种通过对每个应用程序进行孤立检查&#xff0c;以确保其发送或接收的消息符合在“合同”中记录的共享理解的集成点测试技术。对于通过HTTP进行通信的应用程序&#xff0c;这些“消息”将是HTTP请求和响应&#xff0c;而对于使用队列的应用程序&#xff0c;则是放入…

代码版本管理工具 git

1. 去B站看视频学习&#xff0c;只看前39集&#xff1a; 01-Git概述&#xff08;Git历史&#xff09;_哔哩哔哩_bilibili 2.学习Linux系统文本编辑器的使用 vi编辑器操作指令分享 (baidu.com) (13条消息) nano编辑器的使用_SudekiMing的博客-CSDN博客 windows下载安装Git官…

《入门级-Cocos2d 4.0塔防游戏开发》---第三课:欢迎界面开发(一)

目录 一、开发环境介绍 二、开发内容 三、显示效果 四、知识点总结 4.1 场景转场 4.2 场景转场流程 4.3 MenuItemSprite和Sprite区别 一、开发环境介绍 操作系统&#xff1a;UOS1060专业版本。 cocos2dx:版本 环境搭建教程&#xff1a; 统信UOS下配置安装cocos2dx开…

Packet Tracer – 配置系统日志和 NTP

Packet Tracer – 配置系统日志和 NTP 目标 第 1 部分&#xff1a;配置系统日志服务 第 2 部分&#xff1a;生成日志记录事件 第 3 部分&#xff1a;手动设置交换机时钟 第 4 部分&#xff1a;配置 NTP 服务 第 5 部分&#xff1a;验证带时间戳的日志 拓扑图 场景 在本…

js的变量

目录 变量 var和let 1.for循环中的声明 2.暂时性死区 3.全局声明 4.条件声明 const声明 变量 java是一种强数据类型语言,对数据类型要求高&#xff0c;要声明清楚变量的类型 数据类型 变量名 值 -----> int a 10 而javaScrit是一种弱类型语言&#xff0c;在声明变…

mac cli文件管理器

背景 最近研究了一下在控制台查看文件的插件ranger, 官方的解释是&#xff1a;一个cli下的文件管理器。觉得效果也很酷炫&#xff0c;所以在此展示一下。 安装 brew install ranger配置生成 建议第一次使用的时候使用 ranger --copy-configall将会在~/.config/ranger目录输…

如何做好IT类的技术面试

目录 一、IT行业的招聘渠道 二、如何做好技术面试官 三、谈谈IT行业如何做好招聘工作 四、面试IT公司的小技巧 五、面试有哪些常见的问题 六、关于面试的一些建议 面试可能是我们每个人都必须会遇到的事情&#xff0c;而技术面试更具有专业性&#xff0c;以下会从几个方面…

实现一个简单的前端MVVM框架类似VUE

在本篇博客中&#xff0c;我们将使用原生JavaScript实现一个简单的前端MVVM框架&#xff0c;类似于VUE。MVVM是Model-View-ViewModel的缩写&#xff0c;是一种用于构建现代化、可维护的前端应用程序的架构模式。MVVM框架通过数据绑定和组件化的方式实现了视图与数据的双向绑定&…

【Docker】使用docker-maven-plugin插件构建发布推镜像到私有仓库

文章目录 1. 用docker-maven-plugin插件推送项目到私服docker1.1. 构建镜像 v1.01.2. 构建镜像 v2.01.3. 推送到镜像仓库 2. 拉取私服docker镜像运行3. 参考资料 本文描述了在Spring Boot项目中通过docker-maven-plugin插件把项目推送到私有docker仓库中&#xff0c;随后拉取仓…

读发布!设计与部署稳定的分布式系统(第2版)笔记25_互联层之路由和服务

1. 控制请求数量 1.1. 这个世界可以随时摧毁我们的系统 1.1.1. 要么拒绝工作 1.1.2. 要么扩展容量 1.1.3. 没有人会在与世隔绝的环境中使用服务&#xff0c;现在的服务大多必须处理互联网规模的负载 1.2. 系统的每次失效&#xff0c;都源自某个等待队列 1.3. 每个请求都会…

【雕爷学编程】Arduino动手做(97)---10段LED光柱模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

C#,数值计算——逻辑斯谛分布(logistic distribution)的计算方法与源程序

逻辑斯谛分布即增长分布&#xff0c;增长分布的分布函数是“增长函数”&#xff0c;亦称“逻辑斯谛函数”(logistic function)&#xff0c;故增长分布亦称做“逻辑斯谛分布”。逻辑斯谛分布(logistic distribution)是一种连续型的概率分布&#xff0c;记为L(μ,γ)&#xff0c;…

#systemverilog# 说说Systemverilog中《automatic》那些事儿

前面我们学习了有关systemverilog语言中有关《static》的一些知识,同static 关系比较好的哥们,那就是 《automatic》。今天,我们了解认识一下。 在systemveriog中,存在三种并发执行语句,分别是fork..join,fork...join_any和fork..join_none,其中只有fork...join_none不…

OSPF路由协议(红茶三杯CCNA)

链路状态路由协议 OSPF&#xff08;开放式最短路径优先&#xff09;Open Shortest Path First 是一种链路状态路由协议&#xff0c;无路由循环&#xff08;全局拓扑&#xff09;&#xff0c;RFC2328 “开放”意味着非私有的 管理型距离&#xff1a;110 OSPF采用SPF算法计算到达…

vmware虚拟机屏幕太小怎么办

虚拟机里面安装Ubuntu有时候屏幕会自动调整&#xff0c;有时会不会自动调整。 当遇到屏幕太小怎么办&#xff1f; 调整Ubuntu屏幕分辨率就可以了。 我不能说不能通过设置虚拟机达到同样的效果&#xff0c; 但是我可以告诉你设置Ubuntu系统的分辨率可以解决这个问题。 具体…

python爬虫(一)_爬虫原理和数据抓取

关于Python爬虫&#xff0c;我们需要学习的有&#xff1a; Python基础语法学习(基础知识)HTML页面的内容抓取(数据抓取)HTML页面的数据提取(数据清洗)Scrapy框架以及scrapy-redis分布式策略(第三方框架)爬虫(Spider)、反爬虫(Anti-Spider)、反反爬虫(Anti-Anti-Spider)之间的斗…

VIS for AI :ConvNetJS

1.简单介绍&#xff1a; ConvNetJS是由斯坦福大学计算机科学系的Andrej Karpathy开发的一个深度学习框架&#xff0c;用于在浏览器中运行卷积神经网络&#xff08;ConvNet&#xff09;。ConvNetJS可以帮助开发人员在客户端&#xff08;浏览器&#xff09;上进行深度学习任务&a…

NLP From Scratch: 生成名称与字符级RNN

NLP From Scratch: 生成名称与字符级RNN 这是我们关于“NLP From Scratch”的三个教程中的第二个。 在<cite>第一个教程< / intermediate / char_rnn_classification_tutorial ></cite> 中&#xff0c;我们使用了 RNN 将名称分类为来源语言。 这次&#xff…