c++:类和对象(3),对象模型和this指针

news2024/11/24 6:51:59

成员变量和成员函数分开存储

  • 空对象占用内存空间为:1
  • c++编译器会给每个空对象也分配一个字节空间,是为了区分空对象占内存的位置
  • 每个空对象也应该有一个独一无二的内存地址

 只有非静态成员变量 属于类的对象上,其余都不属于类的对象上


this指针概念

this指针 指向 被调用的成员函数所属的对象

this指针的用途:

  • 当形参和成员变量名相同时,可以用this指针来区分
  • 在类的非静态成员函数中返回对象本身,可使用return *this

1.解决名称冲突 

 

2. 使用 this 指针返回对象本身

在上述示例中,我们创建了一个名为 Point 的类,其中包含两个私有成员变量 x 和 y。在成员函数 setX 和 setY 中,我们使用 this 指针来返回对象本身。

setX 函数通过将传入的参数 x 赋值给对象的成员变量,并返回 *this,即对象本身。

setY 函数通过将传入的参数 y 赋值给对象的成员变量,并返回 *this,即对象本身。

在 main 函数中,我们创建了一个 Point 对象 point,初始坐标为 (0,0)。然后,我们通过连续调用 setX 和 setY 方法,分别设置对象的 x 和 y 坐标。由于 setX 和 setY 方法都返回对象本身,我们可以使用点运算符 . 连续调用这些方法。最后,我们调用 print 方法,打印对象的坐标。

通过使用 this 指针返回对象本身,我们可以实现链式调用对象的成员函数,提高代码的可读性和灵活性。


空指针访问成员函数

在上述示例中,我们定义了一个名为 MyClass 的类,并在其中声明了一个名为 myFunction 的成员函数。

在 main 函数中,我们创建了一个空指针 ptr 并将其初始化为 nullptr。接下来,我们尝试通过空指针 ptr 调用 myFunction 成员函数。

由于 ptr 是空指针,它并不指向任何有效的对象。因此,当尝试通过空指针访问成员函数时,会导致未定义的行为。

为了避免空指针访问成员函数导致的问题,我们应该在调用成员函数之前确保指针指向一个有效的对象。


const修饰成员函数

常函数:

  • 成员函数后加const后我们称为这个函数为常函数
  • 常函数内不可以修改成员属性
  • 成员属性声明时加关键字mutable后,在常函数中依然可以修改
#include <iostream>

using namespace std;

class MyClass 
{
private:
    mutable int count; // 声明一个 mutable 成员属性

public:
    MyClass()
    {
        count = 0;
    }

    int getValue() const
    {
        count++; // 在常函数中修改 mutable 成员属性

        return count;
    }
};

int main()
{
    const MyClass obj;

    cout << "First Access: " << obj.getValue() << endl;
    cout << "Second Access: " << obj.getValue() << endl;

    return 0;
}

 

常对象: 

  • 声明对象前加const称该对象为常对象
  • 常对象只能调用常函数

#include <iostream>

using namespace std;

class MyClass 
{
public:
    void myFunction() const 
    {
        cout << "This is a constant member function." << endl;
    }

    void myNonConstFunction() 
    {
        cout << "This is a non-constant member function." << endl;
    }
};

int main() {
    const MyClass obj1;  // 声明一个常对象
    obj1.myFunction();  // 可以调用常函数
    // obj1.myNonConstFunction();  // 错误!不可以调用非常函数

    MyClass obj2;  // 声明一个非常对象
    obj2.myFunction();  // 可以调用常函数
    obj2.myNonConstFunction();  // 可以调用非常函数

    return 0;
}

在上述示例中,我们定义了一个名为 MyClass 的类,并声明了一个常对象 obj1 和一个非常对象 obj2

常对象 obj1 被声明为 const,因此它只能调用常函数。在此例子中,我们使用 obj1.myFunction() 来调用常函数 myFunction(),它可以在常对象上执行,因为它不会修改对象的状态。而对于非常函数 myNonConstFunction(),尝试在常对象上调用会导致编译错误。

非常对象 obj2 没有被声明为 const,所以它可以调用常函数和非常函数。我们可以使用 obj2.myFunction() 来调用常函数,也可以使用 obj2.myNonConstFunction() 来调用非常函数。

常对象的存在可以确保对象在使用期间不会被意外地修改,提供了一定的安全性和保护性。常对象通常用于需要只读访问的情况,常函数则用于在常对象上进行操作而不改变其状态。

请注意,常对象的成员变量也被隐式声明为 const,即使没有显式使用 const 修饰。这意味着在常对象上,所有的成员变量都是只读的,不能被修改。

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

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

相关文章

网工内推 | 上市公司同程、科达,五险一金,年终奖,最高12k*15薪

01 同程旅行 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1.负责职场、门店网络规划、建设、维护。 2.负责网络安全及访问控制、上网行为管理和VPN设备的日常运维&#xff1b; 3.负责内部相关网络自动化和系统化建设&#xff1b; 4.优化与提升网络运行质量&#xff…

激光雷达行业梳理2-产业链、公司、未来展望

四、产业链及竞争格局 激光雷达产业链可以分为上游&#xff08;光学和电子元器件&#xff09;、中游&#xff08;集成激光雷达&#xff09;、下游&#xff08;不同应用场景&#xff09;。其中 上游即激光发射、激光接收、扫描系统和信息处理四大部分&#xff0c;主要包括激光器…

设备通过GB28181注册到EasyCVR,平台看不到设备信息的排查方法汇总

智慧安防平台EasyCVR能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台支持设备通过4G、5G、WIFI、有线等方式进行视频流的接入与传输&#xff0c;支持的接入协议包括&#xff1…

Shell脚本的变量

目录 shell脚本变量&#xff1a; 1.变量的介绍&#xff1a; 2.变量的作用&#xff1a; 3.变量的类型 &#xff1a; 4.自定义变量 &#xff1a; &#xff08;1&#xff09;自定义变量命名要求&#xff1a; &#xff08;2&#xff09;定义与查看变量&#xff1a; &#x…

为什么单片机不能直接驱动继电器和电磁阀?

为什么单片机不能直接驱动继电器和电磁阀&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&…

SpringBoot3(一)动力节点总结

目录 0、有用的新特性 一、Record 1.1、Record的介绍 1.2、Record的声明 1.3、Record的创建 0、有用的新特性 JDK8-19 新增了不少新特性&#xff0c;这里我们把实际常用的新特性&#xff0c;给大家介绍一下&#xff0c;包括以下几个方面&#xff1a; Java RecordSwich 开…

数据结构(Chapter Two -03)—线性表的链式表示

在这一部分&#xff08;数据结构(Chapter Two -01)—线性表及顺序表-CSDN博客&#xff09;里面&#xff0c;我们知道线性表包括顺序表和链表结构。前面写了顺序表的基本操作&#xff0c;那这部分就写一写线性表叭&#xff01; 链表特点&#xff1a;不需要使用地址连续的存储单…

ctfshow-SQL注入(web214-web220)

时间盲注 &#xff08;最贴合实际的注入&#xff09; web214 什么都不存在 使用bp进行抓包看看有没有注入点 在原始页面刷新 抓包发现修改debug为1是返回结果是一个sql的查询语句 id可能存在注入点 发现存在时间注入 使用web193脚本进行修改 python盲注脚本 import requests …

「JavaScript基础」一文彻底搞懂JS的事件流以及事件模型

目录 事件事件机制一、事件绑定二、事件监听三、事件委托 事件流事件流模型DOM事件处理DOM0DOM2IE 事件处理程序 常见的事件 在JavaScript中&#xff0c;事件流和事件模型是处理用户交互的关键概念。深入理解这些概念将使你能够更好地处理和响应用户的动作。本文将详细介绍Java…

冷链温湿度监控解决方案,实时监测,助力运输安全

为了确保药品、生鲜等在冷链运输过程中的安全监管,需要对冷链、仓库等环节的温湿度信息进行实时自动检测和记录&#xff0c;有效防范储运过程中可能影响产品质量安全的各类风险&#xff0c;确保储存和运输过程的产品质量。 冷链温湿度监控系统解决方案&#xff0c;利用智能温湿…

leetcode—— 腐烂的橘子

腐烂的橘子 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到…

每日一道算法题 15(2023-12-28)TLV解析Ⅰ

package com.tarena.test.B20; import java.util.ArrayList; import java.util.Scanner; import java.util.StringJoiner; /** * TLV解析Ⅰ * author Administrator * 输入&#xff1a; * 第一行 31 * 第二层 32 01 00 AE 90 02 00 21 02 30 03 00 AB 32 31 31 0…

UI自动化测试框架搭建 —— yaml文件管理定位元素

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

万界星空科技mes系统可以为企业带来什么好处

随着信息技术的不断发展&#xff0c;MES生产制造系统的作用不断凸显。万界星空科技MES生产制造可以为企业带来四个方面的好处&#xff1a;提升生产效率、降低生产成本、优化生产过程、提高生产质量。本文将从这四个方面分别进行详细阐述&#xff0c;旨在通过对MES生产制造系统的…

【优先级队列 之 堆的实现】

文章目录 前言优先级队列 PriorityQueue优先队列的模拟实现 堆堆的储存方式堆的创建建堆的时间复杂度堆的插入与删除 总结 前言 优先级队列 PriorityQueue 概念&#xff1a;对列是先进先出的的数据结构&#xff0c;但有些情况&#xff0c;数据可能带有优先级&#xff0c;一般出…

C++11新特性:快速初始化成员变量

在C98中&#xff0c;类成员变量的就地声明通常需要在构造函数中进行初始化。 class MyClass { public:// C98 中的类成员变量声明int myVariable;// 构造函数中初始化MyClass() {myVariable 0;} };并且&#xff0c;C98对类中就地声明要求非常高&#xff0c;如果不是整型或者枚…

java使用easyexcel读取excel内容

java 代码读取excel内容。 使用阿里巴巴easyexcel读取excel内容。 ##excel内容 ##依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.5</version></dependency> ##实体类T…

Adobe Media Encoder 2023下载安装教程,ME 2023安装教程,附安装包和工具,无套路,轻松搞的安装

前言 Adobe Media Encoder是一个视频和音频编码应用程序&#xff0c;可让针对不同应用程序和观众&#xff0c;以各种分发格式对音频和视频文件进行编码。包括专门设计的预设设置&#xff0c;以便导出与特定交付媒体兼容的文件&#xff0c;可以按适合多种设备的格式导出视频&am…

Mybatis集成MySQL使用游标查询处理大批量数据

背景 基于数据的时间范围查询&#xff0c;给符合条件的用户推送积分即将到期的提醒。 初期用户量小使用最普通简单的分页查询扫描数据处理数据没问题。随着用户量的上升表数据已经上千万&#xff0c;每天扫描处理的数量也超百万&#xff0c;limit分页出现了慢sql&#xff0c;…

【EISCOPUS双检索】2024电子、通信与智能科学国际会议(ECIS 2024)征稿通知!

2024年5月24日-27日 中国|长沙 会议重要日期 一轮截稿时间&#xff1a;2024年3月10日 录用通知时间&#xff1a;投稿后7-15天 注册截止时间&#xff1a;2024年5月10日 一、大会背景 随着互联网的不断创新&#xff0c;电子、通信和智能科学已经广泛应用于各个领域。为了为…