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

news2025/2/22 20:16:18

类和对象

类的一般形式

在这里插入图片描述

访问控制限定符

  • 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;
}

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

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

相关文章

C++空类的那点事儿

什么是C的空类 顾名思义&#xff0c;空类就是指哪些不包含成员变量的类。例如以下这个就是一个空类&#xff1a; class EmptyBase {}; 既然如此&#xff0c;那么是不是说空类的内部一定不会其他代码呢&#xff1f;不是的&#xff0c;空类内部也可以包含其他东西&#xff0c;…

数字化车间|用可视化技术提升车间工作效率

数字化车间正在成为现代制造业的重要组成部分。随着科技的不断进步&#xff0c;传统的车间生产方式逐渐地被数字化和自动化取代。数字化车间将机器和软件进行整合&#xff0c;实现了生产过程的高效、精确和可追溯。在数字化车间中&#xff0c;机器之间可以进行无缝的通信和协作…

【云备份】客户端实现 及 项目整体总结

文章目录 客户端客户端实现思想客户端文件操作类的设计与拷贝Util.hpp的设计data.hpp的设计Storage —— 持久化存储Initload——数据初始化加载 cloud.hpp的设计GetFileIdentifier——创建文件唯一标识Upload—— 文件上传IsNeedupload —— 客户端文件是否需要上传判断RunMod…

正点原子linux应用编程——提高篇5

这篇笔记记一下网络应用编程以及CAN总线的应用编程。 网络基础知识 这个在学习lwIP的时候已经接触过了&#xff0c;这边再过一下&#xff0c;我自己觉得没什么意思的我就跳过了。 网络通信概述 网络通信本质上是一种进程间通信&#xff0c;是位于网络中不同主机上的进程之间…

麒麟linux将图片批量生成PDF的方法

笔者手里有一批国产linu系统&#xff0c;目前开始用在日常的工作生产环境中&#xff0c;我这个老程序猿勉为其难的充当运维的或网管的角色。 国产linux系统常见的为麒麟Linux&#xff0c;统信UOS等&#xff0c;基本都是基于debian再开发的linux。 问题描述&#xff1a; wind…

冬天来了,波司登的高端化“春天”不远了?

最近&#xff0c;羽绒服频繁“贵”上热搜。 在众多热搜词条中&#xff0c;一条“国产羽绒服卖到7000元”的话题一度将波司登推上了舆论的风口浪尖。 对此&#xff0c;波司登在最新的业绩说明会上进行了回应&#xff0c;公司表示&#xff1a;“波司登旗下主品牌及子品牌将形成差…

律所信息化建设成为趋势,Alpha系统助力律所数字化升级

近些年来&#xff0c;越来越多的律所借助数字化技术进行信息化建设&#xff0c;围绕“智慧律所”建设做了大量的努力。为尽快完成这一目标&#xff0c;经过深入研判&#xff0c;多数律所决定引进“Alpha法律智能操作系统”。该系统以其强大功能为律所智慧化建设注入催化剂。 据…

2023年AI工具排行榜:最全工具汇总!

如今&#xff0c;人工智能技术正在快速崛起,AI助手、语音识别、机器翻译等工具深深渗透到我们的工作和生活中。这些智能工具极大地提高了我们的工作效率,使我们能更加专注于创造性的任务。 本文将为读者推荐一些实用的AI神器,只要掌握其中一个,就能极大地提升你的工作能力,事半…

使用Python的PyQt实现财务综合计算

背景&#xff1a; 考核内容 使用 Python 编写程序代码&#xff0c;设计一个带交互界面的财务分析软件&#xff0c;并满足以下要求: PART1:《财务软件设计思路报告》 (30分) (1)编写《财务软件设计思路报告》&#xff0c;描述你编制这个财务软件的设计目标、应用场景、设计思路…

Mysql进阶-事务锁

前置知识-事务 事务简介 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 就比如: 张三给李四转账1000块钱&#xff0…

基于AT89C51单片机四位加法计算器的设计

1&#xff0e;设计任务 利用AT89C51单片机为核心控制元件,设计一个四位加法计算器&#xff0c;设计的系统实用性强、操作简单&#xff0c;实现了智能化、数字化。 1&#xff09;、通过4*4矩阵键盘输入数字及运算符&#xff1b; 2&#xff09;、可以进行4位十进制数以内的加法…

线程池(Linux +C)

参考 手写线程池 - C语言版 | 爱编程的大丙 (subingwen.cn) 目录 1.为什么需要线程池&#xff1f; 1&#xff09;线程问题&#xff1a; 2&#xff09;如何解决线程问题&#xff08;线程池的优势&#xff09;&#xff1a; 2.线程池是什么&#xff1f; 1&#xff09;线程的…

某夕夕商家告诉你:这样寄快递居然这么省钱(便宜寄全国)

在当下很多时候寄快递成为了困扰很多人的问题&#xff0c;比如很多时候都会面临运费贵的问题&#xff0c;而且寄快递的效率也得不到保障&#xff0c;即使投诉快递员最终也是无济于事。其实在目前来看寄快递并没有这么难&#xff0c;闪侠惠递就能够有效的寄快递&#xff0c;而且…

试验数字化平台WDP 助力车企数据管理加速度

一 现状 随着现代测控技术的提高&#xff0c;数据结构变得越来越复杂多样&#xff0c;数据量也在日益增大。又因试验条件的限制&#xff0c;大多数企业的数据管理方式主要是通过各类电子文档将试验数据保存在每个工程师的移动电脑中&#xff0c;再进行汇总存储和共享。这种落后…

OpenHarmony 设备启动Logo和启动视频替换指南

前言 OpenHarmony源码版本&#xff1a;4.0release 开发板&#xff1a;DAYU / rk3568 一、Logo替换 替换其中的logo.bmp 和 logo_kernel.bmp文件 注意事项&#xff1a; 1、图片的分辨率需要和设备匹配 2、如果是非首次编译&#xff08;存在缓存&#xff09;需要将out目录删…

【Backbone】TransNeXt:最新ViT模型(原理+常用神经网络汇总)

文章目录 一、近几年神经网络 Backbone 回顾1.Densenet 与 Resnet2.CBP3.SENet4.GCNet5.DANet6.PANet 与 FPN7.ASPP8.SPP-net9.PSP-net10.ECA-Net 二、TransNeXt&#xff08;2023&#xff09;1.提出问题2.Aggregated Pixel-focused Attention2.1 Pixel-focused Attention&#…

如何一个月内发表一篇中文核心 干货分享

发论文经验教学 干货分享&#xff1a;如何在一个月内发表一篇中文核心 经验分享 干货分享_哔哩哔哩_bilibili

元宇宙红色展厅VR虚拟展馆提高受训者的参与感

生活在和平年代的新一代青少年&#xff0c;可能对革命先烈英勇事迹难以有很深的体会&#xff0c;无法切实感受到中国共产党无畏牺牲、誓死保家卫国的红色精神&#xff0c;因此借助VR虚拟现实制作技术&#xff0c;让参观者们走近革命先烈中&#xff0c;感受老一辈无产阶级革命家…

C语言-字符串变量

字符串变量 char* s “Hello, world!”&#xff1b; s是一个指针&#xff0c;初始化为指向一个字符串常量 由于这个常量所在的地方&#xff0c;所以实际上s是const char* s&#xff0c;但是由于历史的原因&#xff0c;编译器接受不带const的写法但是试图对s所指的字符串做写…

龙迅#LT8311X3 USB中继器应用描述!

1. 概述 LT8311X3是一款USB 2.0高速信号中继器&#xff0c;用于补偿ISI引起的高速信号衰减。通过外部下拉电阻器选择的编程补偿增益有助于提高 USB 2.0 高速信号质量并通过 CTS 测试。 2. 特点 • 兼容 USB 2.0、OTG 2.0 和 BC 1.2• 支持 HS、FS、LS 信令 • 自动检测和补偿 U…