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;   // 这里编译器会补this
        return *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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

禅道不同系统迁移详解及Linux安装(windows->linux)

一、禅道迁移前提 官网下载链接 一定要用相同版本&#xff0c;一定要相同版本&#xff0c;一定要相同版本。负责导入数据必然有问题(完全一致的那种&#xff0c;小版本也要一样) 可以在后台哪里看版本&#xff0c;或者在右下角哪里看版本&#xff0c;然后去官网搜索 二、安…

掌控安全 -- header注入

http header注入 该注入是指利用后端验证客户端口信息&#xff08;比如常用的cookie验证&#xff09;或者通过http header中获取客户端的一些信息&#xff08;比如useragent用户代理等其他http header字段信息&#xff09;&#xff0c;因为这些信息是会重新返回拼接到后台中的&…

基于PIPNet的人脸106关键点检测

做美颜需要使用到人脸关键点&#xff0c;所以整理了一下最近的想法。 按模型结构分类&#xff1a; 1.Top-Down: 分为两个步骤&#xff0c;首先&#xff0c;对于原始输入图片做目标检测&#xff0c;比如做人脸检测&#xff0c;将人脸区域抠出&#xff0c;单独送进关键点检测模…

天津python培训课程,普通人学python有用吗?

选择一个正确的行业对于个人的发展至关重要&#xff0c;在当今时代&#xff0c;IT行业高薪的特点吸引了越来越多的人转行“入坑”&#xff0c;而作为目前的热门编程语言&#xff0c;python也是很多人转行的选择。 Python培训学费选择 python培训班学费可能会因为培训机构所在…

C#简化工作之实现网页爬虫获取数据

1、需求 想要获取网站上所有的气象信息&#xff0c;网站如下所示&#xff1a; 目前总共有67页&#xff0c;随便点开一个如下所示&#xff1a; 需要获取所有天气数据&#xff0c;如果靠一个个点开再一个个复制粘贴那么也不知道什么时候才能完成&#xff0c;这个时候就可以使用C…

Isaac Sim教程06 OmniGraph图编程

Isaac Sim OmniGraph图编程 版权信息 Copyright 2023 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. The autho…

mac shortcut keys cheat sheet【mac 快捷键清单】

文章目录 剪切、拷贝、粘贴和其他常用快捷键访达和系统快捷键 Mac 键盘快捷键 Command&#xff08;或 Cmd&#xff09;⌘ Shift ⇧ Option&#xff08;或 Alt&#xff09;⌥ Control&#xff08;或 Ctrl&#xff09;⌃ Caps Lock ⇪ Fn 剪切、拷贝、粘贴和其他常用快捷…

【数据结构与算法】JavaScript实现二叉搜索树

文章目录 一、二叉搜索树的封装1.插入数据2.遍历数据2.1.先序遍历2.2.中序遍历2.3.后续遍历 3.查找数据3.1.查找最大值&最小值3.2.查找特定值 4.删除数据4.1.情况1&#xff1a;没有子节点4.2.情况2&#xff1a;有一个子节点4.3.情况3&#xff1a;有两个子节点4.4.完整实现 …

【性能测试】LR录制回放事务检查点

前言 上一次推文我们分享了性能测试分类和应用领域&#xff0c;今天带大家学习性能测试工作原理、事务、检查点&#xff01;后续文章都会系统分享干货&#xff0c;带大家从0到1学会性能测试&#xff0c;另外还有教程等同步资料&#xff0c;文末免费获取~ 01、LR工作原理 ​通…

CSS特效026:扇骨打开关闭的动画

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

Vue项目图片预览v-viewer插件使用,图片预览,图片查看;antdesign+vue2+v-viewer实现图片查看器并可删除图片

Vue项目图片预览v-viewer插件使用 1. 安装 v-viewer 你可以使用 npm 或者 yarn 来安装 v-viewer&#xff1a; npm install v-viewer 或者 yarn add v-viewer 2. 导入和配置 v-viewer 在你的 Vue 项目中&#xff0c;你需要在入口文件&#xff08;通常是 main.js&#xff09…

做一个类似东郊到家的上门服务类系统有哪些功能?

上门服务系统是一款便捷的技师接单、上门提供理疗服务的软件。我们拥有优秀的开发团队&#xff0c;为您量身定制解决方案&#xff0c;价格合理&#xff0c;用心服务。 预约上门&#xff1a;该功能是预约上门推拿理疗按摩系统软件小程序APP的核心功能。消费者通过系统预约下单&a…

python打包exe,打包好后,启动exe报错找不到paddleocr

目录 1、安装pyinstaller 2、生成脚本文件的.spce文件 3、资源文件配置 4、生成exe文件 5、使用了paddleocr启动exe后报错 6、配置.spce文件 7、重新生成exe文件 8、关于图片找不到的问题 参考&#xff1a;PaddleOCR打包exe--Pyinstaller_paddleocr 打包exe_mjiansun的博…

签名应用APP分发平台的微服务化部署是什么?其有哪些优势?

在信息技术的世界里&#xff0c;软件开发和部署的模式不断演进。从单体架构到服务化&#xff0c;再到今日备受瞩目的微服务架构。微服务化部署作为一种新兴的软件架构风格&#xff0c;正被越来越多的企业采用。它使得应用可以被分解成一套相互独立的最小服务单元。而“分发平台…

Web安全-初识SQL注入(一)

1、初识SQL注入 1.1、什么是注入&#xff1f; 将不受信任的数据作为命令或查询的一部分发送到解析器时&#xff0c;会产生诸如SQL注入、NoSQL注入、OS 注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命令或访问数据。 注入能导…

基于 springboot + vue 健身房管理系统 毕业设计-附源码

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

Temu数据软件:如何使用Temu数据软件优化您的Temu店铺运营

在如今竞争激烈的电商市场中&#xff0c;了解市场趋势、优化产品和店铺运营、了解竞争对手等方面的数据分析变得至关重要。为了帮助Temu平台上的商家更好地了解市场和消费者需求&#xff0c;提高运营效果&#xff0c;Temu数据软件成为了一项强大的工具。本文将介绍一些建议的Te…

【Tomcat】java.net.BindException “Address already in use: NET_Bind“

问题 17:37 Error running Tomcat 7.0.76: Unable to open debugger port (127.0.0.1:14255): java.net.BindException "Address already in use: NET_Bind"调整 把14255 改成 49963就正常了 附件 netstat -aon|findstr "49963" taskkill -f -pid xxx…

WiFi模块ESP8266(超详细)---(含固件库、AP、STA、原子云使用)

写在前面&#xff1a;本节我们学习使用一个常见的模块--WIFI模块&#xff0c;在前面我们学习了蓝牙&#xff08;HC--08&#xff09;模块&#xff0c;为学习WIFI模块打下了一定的基础&#xff1b;但是在学习WIFI模块的时候&#xff0c;我也遇到了很多的问题&#xff0c;查阅了很…

常见的分布式事务解决方案,你会几种?

今天我们来聊一聊分布式事务&#xff0c;在传统的单体应用中&#xff0c;事务的控制非常简单&#xff0c;Spring框架都为我们做了封装&#xff0c;我们只需简单地使用Transactional注解就能进行事务的控制&#xff0c;然而在分布式应用中&#xff0c;传统的事务方案就出现了极大…