4、类和对象、this指针、常对象和常函数

类和对象

类的一般形式

在这里插入图片描述

访问控制限定符

  • public 公有成员,谁都可以访问
  • protected 保护成员,只有类自己和子类可以访问
  • private 私有成员,只有类自己可以访问

类和结构的访问控制限定符区别

  • 类的缺省访问控制限定为私有(private)
  • 结构的缺省访问控制限定为公有(public)

封装

访问控制限定符仅作用于类,而非作用于对象。
对不同成员的访问控制限定加以区分,体现了C++作为面向对象程序设计语言的封装特性。

对象创建过程

定义xxxx: 就是给xxx分配内存空间

Person p;该语句定义了变量p,且给p在栈分配了内存空间,成员属性初值为随机数。

成员函数的this指针

C++对象模型

  • 同一个类的不同对象各自拥有一份独立的成员变量
  • 同一个类的不同对象彼此共享同一份成员函数
  • 哪个对象调用成员函数,成员函数的this指针就指向哪个对象
    在这里插入图片描述

C++成员函数模型

  • ( 除静态成员函数外)类的每个成员函数,都有一个隐藏的指针型形参,形参名为 this.
  • this形参指向调用该成员函数的对象,一般将其称之为this指针
  • ( 除静态成员函数外)在类的成员函数内部,对所有成员的访问都是通过this指针进行的.

应用

  • 多数情况下,程序并不需要显式地使用this指针
  • 有时为了方便,将类的成员变量与该类成员函数的参数取相同标识符这时在成员函数内部,可通过this指针将二者加以区分
  • 返回基于this指针的自引用,以支持串连调用
#include <iostream>
#include <cstring>
using namespace std;class Integer{
public:void setInfo(/* Integer* this */int i){this->i = i;   // 这里必须显式添加this   (1)}void getInfo(/* Integer* this */){cout << /*this->*/i << endl; // 这里编译器会补this}Integer& increment(/* Integer* this */){++/*this->*/i;   // 这里编译器会补thisreturn *this;    // 返回基于this指针的自引用(这里必须自己显式写this) (2)}
private:int i; // m_i
};// 以上代码模拟类的实现者
// -----------------------
// 以下代码模拟类的使用者int main( void ) {Integer ix;ix.setInfo(1000);ix.getInfo();ix.increment().increment().increment();  // 串联调用ix.getInfo();return 0;
}

常对象和常函数

常对象:
被const关键字修饰的对象、对象指针或对象引用,统称为常对象

常函数:
在类成员函数的形参表之后,函数体之前加上const关键字,则该成员函数的this指针即具有常属性,这样的成员函数被称为常函数

原型相同的成员函数,常版本和非常版本构成重载

  • 非常对象优先选择非常版本,如果没有非常版本,也能选择常版本
  • 常对象只能选择常版本

在常函数内部无法修改成员变量的值,除非该成员变量被mutable关键字修饰

// 常对象(被const修饰的对象、指针、引用)和非常对象(没有被const修饰的对象、指针、引用)
// 常函数(编译器补的this参数有const修饰)和非常对象(编译器补的this参数没有const修饰)
#include <iostream>
#include <cstring>
using namespace std;class Integer{
public:void setInfo(/* Integer* this */int i){  // 非常函数m_i = i;}void getInfo(/* Integer* this */){ // 非常函数cout << "非常函数getInfo:" << m_i << endl;}void getInfo(/* const Integer* this  */)const{ // 常函数const_cast<Integer*>(this)->m_i = 666;cout << "常函数getInfo: " << m_i << endl;}
private:/*mutable*/ int m_i;
};// 以上代码模拟类的实现者
// -----------------------
// 以下代码模拟类的使用者int main( void ) {Integer ix;      // ix是非常对象Integer* pix = &ix;  // pix是非常对象Integer& rix = ix;   // rix是非常对象ix.setInfo(1000);ix.getInfo();  // getInfo(&ix)-->实参为Integer* 非常对象优先选择非常函数,也可以选择常函数 const Integer cix = ix;  // cix是常对象const Integer* pcix = &cix; // pcix是常对象const Integer& rcix = cix;  // rcix是常对象cix.getInfo(); // getInfo(&cix)-->实参是const Integer* 常对象只能选择常函数,不能选择非常函数return 0;
}

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

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

相关文章

弱引用能指针 weak_ptr

弱引用智能指针 概述 弱引用智能指针std::weak_ptr可以看做是shared_ptr的助手&#xff0c;它不管理shared_ptr内部的指针。std::weak_ptr没有重载操作符*和->&#xff0c;因为它不共享指针&#xff0c;不能操作资源&#xff0c;所以它的构造不会增加引用计数&#xff0c;…

离散化 Discretization

离散化 **离散化有一个很重要的前提:**只关心数据之间的相对大小关系,不用关心绝对大小。 离散化,把无限空间中有限的个体映射到有限的空间中去。离散化是在不改变数据相对大小的条件下,对离散的数据进行相应的范围缩小。 离散化过程,将一组实数转换为一组整数,使得原始…

gimagereader安装在windows环境的方法

​ 首先github下载.exe的安装包&#xff0c; gtk或者qt5都可以。推荐gtk。 https://github.com/manisandro/gImageReader/releases 直接下载的地址&#xff1a; ​ https://github.com/manisandro/gImageReader/releases/download/master/gImageReader_latest_gtk_x86_64.ex…

前端知识笔记(二十一)———浏览器的缓存策略

浏览器缓存的策略主要分为两种&#xff1a;过期机制和验证机制。 过期机制&#xff1a;是指浏览器根据资源的过期时间&#xff0c;判断是否可以直接使用缓存中的副本&#xff0c;而无需向服务器发起请求。过期时间可以通过以下两种方式设置&#xff1a; Cache-Control&#xf…

Java基础数据类型

Java有八种基础的数据类型&#xff0c;它们被分为两个主要的类别&#xff1a;原始类型和引用类型。原始类型又被分为四类&#xff1a;整型、浮点型、字符型和布尔型。 整型&#xff08;Integral Types&#xff09;&#xff1a; 这些类型用于存储整数。它们包括&#xff1a; ○…

最高性能、最低错误率!一年沉寂,IBM王者归来

周一&#xff0c;国际商业机器公司&#xff08;IBM&#xff09;发布了首台量子计算机&#xff0c;它拥有1000多个量子比特&#xff08;相当于普通计算机中的数字比特&#xff09;。但该公司表示&#xff0c;现在它将转变思路&#xff0c;专注于提高机器的抗错能力&#xff0c;而…

羊大师提问鲜羊奶冷冻还好喝吗?

羊大师提问鲜羊奶冷冻还好喝吗&#xff1f; 在当今追求健康、养生的时代背景下&#xff0c;各种新奇的饮食趋势层出不穷。鲜羊奶冷冻成为了备受追捧的美食新潮流。不仅具备饮食的功能&#xff0c;更是一种享受。本文小编羊大师将从鲜羊奶冷冻的制作工艺、营养价值和市场前景等…

第2章 知识抽取:概述、方法

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

『时间之外』这个不得不思考的问题,还是要说一下

还记得当初自己为什么选择计算机&#xff1f; 当初你问我为什么选择计算机&#xff0c;我笑着回答&#xff1a;“因为我梦想成为神奇的码农&#xff01;我想像编织魔法一样编写程序&#xff0c;创造出炫酷的虚拟世界&#xff01;”谁知道&#xff0c;我刚入门的那天&#xff0…

Ruff智能物联网网关助力工厂数智化运营,实现产量提升5%

数字化转型是大势所趋&#xff0c;以工业互联网为代表的数实融合是发展数字经济的重要引擎&#xff0c;也是新质生产力的一大助力。工业互联网是新工业革命的重要基石&#xff0c;加快工业互联网规模化应用&#xff0c;是数字技术和实体经济深度融合的关键支撑&#xff0c;是新…

12.5_黑马数据结构与算法Java

目录 001 二分查找 算法描述 002 二分查找 算法实现 003 二分查找 问题1 循环条件 004 二分查找 问题2 中间索引 thinking&#xff1a;反码补码原码&#xff1f; thinking&#xff1a;二进制转十进制&#xff1f; thinking&#xff1a;无符号右移&#xff1f; 005 二分…

SpringBoot 集成Netty、WebSocket,5分钟搭建聊天通信系统

文章目录 前言Netty简介使用Netty开发WebSocket应用程序开始项目一、添加依赖二、自定义处理器三、初始化通道加载器四、配置启动器五、添加启动监听器六、启动项目七、演示效果1. 客户端1看到其他客户端上线2. 客户端3收到客户端1发送的消息3. 客户端1收到客户端2下线前言 在…

出海风潮:中国母婴品牌征服国际市场的机遇与挑战!

近年来&#xff0c;中国母婴品牌在国内市场蓬勃发展的同时&#xff0c;也逐渐将目光投向国际市场。这一趋势不仅受益于中国经济的崛起&#xff0c;还得益于全球市场对高质量母婴产品的不断需求。然而&#xff0c;面对国际市场的机遇&#xff0c;中国母婴品牌同样面临着一系列挑…

学习MYSQL

DDL 建表 DML增删改 DQL查询 DCL控制用户权限 存储引擎 MYSQL体系结构 *连接层 *服务层&#xff08;DML DDL &#xff09; *引擎层&#xff08;可插拔&#xff09;&#xff08;索引在这里&#xff0c;不通的引擎 索引结构不同&#xff09; *存储层&#xff0c; 外键&#xff…

java springboot简单了解数据源实现 与 springboot内置数据源

之前 我们讲到的项目 数据库管理 用了三种技术 数据源管理方式 我们选择了: DruidDataSource 持久化技术: MyBatis-Plus / MyBatis 数据库: MySql 那么 我们在刚接触数据库连接时 是没用配置Druid的 那它有没有用数据源呢&#xff1f; 我们接触过的配置Druid的方式有两种 用…

【发布小程序配置服务器域名,不配置发布之后访问就会报错request:fail url not in domain list】

小程序在本地开发的时候大家通常会在微信开发者工具中设置“不校验合法域名、web-view (业务域名)、TLS 版本以及HTTPS证书”&#xff0c;久而久之可能会忘掉这个操作&#xff0c;然后打包直接上线发布&#xff0c;结果发现访问会报错request:fail url not in domain list&…

Chat-GPT原理

Chat-GPT原理核心:基于Transformer 架构 ​ 以下是参考文献的部分截图原文说明&#xff1a; ​ Transformers are based on the “attention mechanism,” which allows the model to pay more attention to some inputs than others, regardless of where they show up in t…

热门好用的核验类API,含免费次数

信息核验类 实人认证&#xff08;人像三要素&#xff09;&#xff1a;输入姓名、身份证号码和一张人脸照片&#xff0c;与公安库身份证头像进行权威比对&#xff0c;返回比对分值。实名认证&#xff08;身份证二要素&#xff09;&#xff1a;核验身份证二要素&#xff08;姓名…

2023年甘肃省职业院校技能大赛(中职教师组)网络安全竞赛样题(三)

2023年甘肃省职业院校技能大赛&#xff08;中职教师组&#xff09; 网络安全竞赛样题&#xff08;三&#xff09; &#xff08;总分1000分&#xff09; 目录 模块A 基础设施设置与安全加固 模块B 网络安全事件响应、数字取证调查和应用安全 B-1任务一&#xff1a;主机发现…

MySQL之binlog文件过多处理方法

背景 MySQL由于大量读写&#xff0c;导致binlog文件特别的多。从而导致服务器disk空间不足问题。 先备份binlog文件 tar -zcvf mysql.tar.gz mysql/data/mysql-bin.00* 修改MySQL配置 binlog过期时间 show variables like expire_logs_days; 这里 0 表示 永不过期 如果为 n…