C++编程(四)this指针 常函数 常对象 静态成员

news2024/11/23 12:06:03

文章目录

  • 一、this指针
    • (一)概念
    • (二)显式使用this指针的场景
      • 1. 当形参和成员变量名一致时
      • 2. 返回对象自身的时候必须要使用this指针
      • 3. 在类中销毁一个对象
  • 二、常函数和常对象
    • (一)常函数
      • 1. 概念
      • 2. 语法格式
    • (二)常对象
      • 1. 概念
      • 2. 语法格式
    • (三)使用示例
  • 三、静态成员
    • (一)静态成员变量
      • 1. 概念
      • 2. 语法格式
      • 3. 调用静态成员变量的方式
    • (二)静态成员函数
      • 1. 概念
      • 2. 语法格式
      • 3. 调用静态成员函数的方式

一、this指针

(一)概念

this指针是隐藏在类的成员函数中的一个隐藏的形参,就是this指针
this指针指向对象的自身。类型是类类型

  • 注:
  • this指针不能显式的出现在形参表中
  • this指针不能显式的出现在初始化列表中
  • this指针指向对象的自身
  • this指针只能出现在类中
  • this是C++中的关键字
  • 类中的成员变量本质上就是通过this指针指向的,但是可以省略不写

(二)显式使用this指针的场景

1. 当形参和成员变量名一致时

不仅可以使用初始化参数列表,还可以使用this指针

#include <iostream>

using namespace std;

class A{
public:
    A(int m_a,int m_b){
        this->m_a = m_a;
        this->m_b = m_b;
    }
    void print(){
        cout<<"m_a="<<m_a<<" m_b="<<m_b<<endl;
    }
private:
    int m_a;
    int m_b;
};

int main()
{
    A a(10,20);
    a.print();
    return 0;
}

2. 返回对象自身的时候必须要使用this指针

#include <iostream>

using namespace std;

class A{
public:
    A(int m_a,int m_b){
        this->m_a = m_a;
        this->m_b = m_b;
    }
    A& add(){
        m_a++;
        m_b++;
        return *this; //返回对象自身
    }
    void print(){
        cout<<"m_a="<<m_a<<" m_b="<<m_b<<endl;
    }
private:
    int m_a;
    int m_b;
};
int main()
{
    A a(10,20);
    a.print();
    a.add();
    a.print();
    a.add().add().add();
    a.print();
    return 0;
}

输出结果
在这里插入图片描述

3. 在类中销毁一个对象

#include <iostream>

using namespace std;

class A{
public:
    A(int m_a,int m_b){
        this->m_a = m_a;
        this->m_b = m_b;
    }
    void print(){
        cout<<"m_a="<<m_a<<" m_b="<<m_b<<endl;
    }
    void destory(){
        delete this;
    }
private:
    int m_a;
    int m_b;
};
int main()
{
    A a(10,20);
    a.print();
    a.destory();
    return 0;
}

二、常函数和常对象

(一)常函数

1. 概念

常函数又称为常成员函数,用const修饰的成员函数叫做常函数。

  • 注:
  • const是用来修饰this指针;
  • 常函数中不能对成员变量进行修改
  • 如果要对常函数中成员变量进行修改,需要将成员变量用mutable进行修饰,但是一般不这样使用

2. 语法格式

普通函数:
返回值类型 函数名(形参表){ ... }

常函数:
返回值类型 函数名(形参表) const { ... }

  • 注:
  • 常函数版本和非常函数版本构成重载关系,如果同时出现,优先调用非常函数版本,如果没有非常函数版本,才会调用常函数版本

(二)常对象

1. 概念

用const修饰的对象就是常对象

2. 语法格式

const 类名 对象名;

  • 注:
  • 如果对象是常对象只能调用常函数版本;
  • 如果对象是非常对象,则会优先调用非常函数版本,如果没有非常函数版本,才会调用常函数版本

(三)使用示例

#include <iostream>
using namespace std;
class Myclass{
public:
    Myclass(int a,int b):m_a(a),m_b(b){
    }
    //非常函数版本
    void print(){
        cout<<"非常函数版本"<<endl;
        cout<<"m_a="<<m_a<<" m_b="<<m_b<<endl;
    }
    //常函数版本
    void print()const{
        cout<<"常函数版本"<<endl;
        cout<<"m_a="<<m_a<<" m_b="<<m_b<<endl;
    }
private:
    int m_a;
    int m_b;
};

int main()
{
    Myclass m(10,20);
    m.print(); //有非常函数版本优先调用非常函数版本
    cout<<"---------------------"<<endl;
    const Myclass n(100,200);
    n.print();
    return 0;
}

输出结果:
常对象会调用常函数版本,非常函数会调用非常函数版本
在这里插入图片描述

如果没有非常函数版本的函数,非常对象也会调用常函数版本:
在这里插入图片描述

如果没有常函数版本,常对象调用非常函数版本会报错
在这里插入图片描述

三、静态成员

static修饰的成员为静态成员
静态成员分为静态成员变量和静态成员函数

(一)静态成员变量

1. 概念

static修饰的成员变量为静态成员变量

2. 语法格式

//静态成员变量的声明
class 类名{
访问控制权限:
	static 数据类型 变量名;
}
//静态成员变量的定义
数据类型 类名::变量名 = 初始值;
  • 注:
  • 静态成员变量是受访问控制权限进行控制的;
  • 静态成员变量必须在类外进行定义,类内只能声明;
  • 静态成员变量在类外定义的时候不用加static修饰,需要在变量名前加上“类名::
  • 静态成员变量不占类的内存空间,属于全局域,只在类中声明;
    不实例化对象也可以访问到静态成员变量

3. 调用静态成员变量的方式

  1. 访问栈区对象
类名 对象名;
对象名.静态成员变量;
  1. 访问堆区对象
类名 *对象名 = new 类名;
对象名->静态成员变量;
  1. 不实例化对象进行访问
类名::静态成员变量;
#include <iostream>
using namespace std;
class Myclass{
public:
    //static int m_s = 200; //类内只能声明,不能定义
    static int m_s; //类内声明
private:
    static int m_a;
    int m_b;
};

int Myclass::m_s=100; //类外定义
int Myclass::m_a=200;
int main()
{
    //堆区对象
    Myclass m;
    cout<<"m.m_s="<<m.m_s<<" |&m.m_s="<<&m.m_s<<endl;
    m.m_s=200;
    //cout<<"m.m_a"<<m.m_a<<endl; //静态成员变量受访问控制权限控制
    //栈区对象
    Myclass *mm = new Myclass;
    cout<<"mm->m_s="<<mm->m_s<<" |&mm->m_s="<<&(mm->m_s)<<endl;
    mm->m_s=300;
    //不实例化对象进行访问
    cout<<"Myclass::m_s="<<Myclass::m_s<<endl;
    return 0;
}

输出结果:
在这里插入图片描述

  • 注:静态成员变量不属于类,因此无论是堆区对象还是栈区对象,它访问静态成员变量访问的都是同一块内存空间。

(二)静态成员函数

1. 概念

static修饰的成员函数为静态成员函数

  • 注:
  • 不属于类,属于全局域,不占用类的内存空间;相当于只是在类里声明了一下
  • 静态成员函数受访问控制权限的限制,一般设置为public
  • 静态成员函数既可以在类内声明,类外实现,也可以在类内声明,类内实现
  • 在类外实现静态成员函数的定义时,不需要加static关键字,但是需要作用域的限定符类名::

2. 语法格式

class 类名{
public:
	static 返回值类型 函数名(); //静态成员函数声明
}

//在类外实现静态成员函数
static 返回值类型 类名::函数名(){}
  • 注:
  • 如果静态成员函数访问静态成员变量直接访问即可;
  • 如果静态成员函数访问非静态成员变量时需要在静态成员函数的形参表中添加一个类类型的形参,之后通过该形参进行访问
  • 静态成员函数不能写成常函数:因为静态成员函数没有this指针
    static void func()const(){} //错误的写法常函数相当于是在给this指针加const,而静态成员函数不属于类,没有this指针

3. 调用静态成员函数的方式

  1. 实例化栈区对象

  1. 实例化堆区对象

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

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

相关文章

Linux Static calls机制

文章目录 前言一、简介二、Background: indirect calls, Spectre, and retpolines2.1 Indirect calls2.2 Spectre (v2)2.3 RetpolinesConsequences 2.4 Static callsHow it works 三、其他参考资料 前言 Linux内核5.10内核版本引入新特性&#xff1a;Static calls。 Static c…

关于摄像头模组中滤光片的介绍

1、问题背景 红外截止滤光片&#xff08;IR CUT Filter&#xff09;是应用在摄像头模组中非常重要的一个器件&#xff0c;因人眼与 coms sensor 对光线各波长的响应不同&#xff0c; 人眼看不到红外光&#xff0c;但 sensor 能感应到&#xff08;如下图是某sensor在各波长下的…

【设计模式-04】原型模式

【设计模式-04】原型模式 1. 概述2. 结构3. 实现4. 案例5. 使用场景6. 优缺点6.1 原型模式的优点6.2 原型模式的缺点 7. 实现深克隆(深拷贝) 1. 概述 原型模式: 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 2. 结构 原型…

策略模式和状态模式

策略模式 在上下文中携带策略接口作为成员变量&#xff0c;在使用上下文之前需要设置策略setStrategy&#xff08;&#xff09;&#xff0c;然后使用策略接口成员变量来进行策略的执行。 步骤1&#xff1a;定义策略接口 // 策略接口 public interface Strategy {int execut…

面试突击:ArrayList源码详解

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。ArrayList 是我们日常开发中不可避免要使用到的一个类&#xff0c;并且在面试过程中也是一个非常高频的知识点&#…

酷睿Ultra 200V系CPU全阵容规格、跑分出炉:拉了坨大的

从最近几个月 12 代酷睿 CPU 大面积降价清库存&#xff0c;到 13、14 代高端 U 大范围翻车问题迟迟得不到解决。 这就很难不让人生出一种 Intel 似乎真无暇顾及老款 U&#xff0c;而是将有限精力通通放在了接下来酷睿 Ultra 处理器上的感觉。 当然&#xff0c;作为新工艺、新架…

【编译原理必考大题】 推导构建语法树,写出语法树的短语,简单短语和句柄

写在最前 本文为编译原理重点考察大题之一&#xff0c;理论基础见专栏文章&#xff0c;0基础直接使用也可食用 文章目录 推导构造语法树1.语法树的概念2. 子树&#xff0c;短语&#xff0c;简单短语&#xff0c;句柄2.1 子树2.2 短语2.3 简单短语与句柄2.4 真题实战 推导构造语…

Discourse OpenAI 生成图片

正如一些讨论的&#xff0c;生成图片是比较贵的。 差不多到了 1 元 一张图了。 就 OpenAI 生成了上面 4 张图&#xff0c;费用 0.4 美元。 Discourse OpenAI 生成图片 - Discourse - iSharkFly

AI 开发平台(Coze)搭建《AI女友(多功能版本)》

前言 本文讲解如何从零开始&#xff0c;使用扣子平台去搭建《AI女友&#xff08;多功能版本&#xff09;》 bot直达&#xff1a;AI女友&#xff08;多功能版&#xff09; - 扣子 AI Bot (coze.cn) 欢迎大家前去体验&#xff01;&#xff01;&#xff01; 正文 功能介绍 …

分别使用netty和apache.plc4x测试读取modbus协议的设备信号

记录一下常见的工业协议数据读取方法 目录 前言Modbus协议说明Netty 读取测试使用plc4x 读取测试结束语 前言 Modbus 是一种通讯协议&#xff0c;用于在工业控制系统中进行数据通信和控制。Modbus 协议主要分为两种常用的变体&#xff1a;Modbus RTU 和 Modbus TCP/IP Modbus …

平面点云格网过程及可视化介绍(python)

1、背景介绍 实际人工构造物中&#xff0c;很多物体表面为平面结构&#xff0c;因此将点云投影在二维平面上进行处理&#xff0c;如进行点云面积计算、点云边缘提取等。 具体案例可以参考博客&#xff1a;详解基于格网法统计平面点云面积_点云格网法计算xy投影面积-CSDN博客、点…

分页处理封装+分页查询题目列表

文章目录 1.sun-club-common封装分页1.com/sunxiansheng/subject/common/eneity/PageInfo.java2.com/sunxiansheng/subject/common/eneity/PageResult.java 2.sun-club-application-controller1.SubjectInfoDTO.java 继承PageInfo并新增字段2.SubjectController.java 3.sun-clu…

8个Unity开发高手都在用的秘密技巧!

1. 不要重新发明轮子&#xff0c;使用内置的引擎工具 在使用任何引擎时&#xff0c;比如Unity或Unreal Engine&#xff0c;一些开发者&#xff0c;主要是来自计算机科学领域的开发者&#xff0c;可能会倾向于从头开始开发大型算法或结构&#xff0c;而不去了解引擎中是否已经存…

三角洲行动卡顿严重?这样快速解决三角洲行动国服卡顿问题

三角洲行动官方精心设计的游戏地图和敌人布局&#xff0c;加上“曼德尔砖”等目标导向性道具的引入&#xff0c;更是为玩家之间的竞技和争夺增添了无数的变数。每一次的争夺都如同是一场智慧与勇气的较量&#xff0c;让人热血沸腾&#xff0c;无法自拔。在这个战场上&#xff0…

免费可视化工具如何提升工作效率?

免费可视化工具能为我们的工作带来什么好处&#xff1f;在如今数据密集的工作环境中&#xff0c;如何高效地处理和展示数据成为了每个行业的重要任务。传统的工具如Excel虽然强大&#xff0c;但在处理复杂数据和创建高级图表时往往显得力不从心。而免费可视化工具的出现&#x…

Arduino - 光敏传感器

Arduino - Light Sensor Arduino - 光传感器 In this tutorial, we are going to learn: 在本教程中&#xff0c;我们将学习&#xff1a; How light sensor works 光传感器的工作原理How to connect the light sensor to Arduino 如何将光传感器连接到ArduinoHow to progra…

C#udpClient组播

一、0udpClient 控件&#xff1a; button&#xff08;打开&#xff0c;关闭&#xff0c;发送&#xff09;&#xff0c;textbox&#xff0c;richTextBox 打开UDP&#xff1a; UdpClient udp: namespace _01udpClient {public partial class Form1 : Form{public Form1(){Initi…

如何在Windows 11上设置默认麦克风和相机?这里有详细步骤

如果你的Windows 11计算机上连接了多个麦克风或网络摄像头&#xff0c;并且希望自动使用特定设备&#xff0c;而不必每次都在设置中乱动&#xff0c;则必须将首选设备设置为默认设备。我们将向你展示如何做到这一点。 如何在Windows 11上更改默认麦克风 有两种方法可以将麦克…

[游戏开发][UE5]引擎使用学习记录

C Log和蓝图Log C Log 方法 UE_Log(参数1&#xff0c;参数2&#xff0c;参数3) //举例: UE_LOG(LogTemp, Error, TEXT("Log Info: %s"),"Test Log"); 三个参数的作用 参数1&#xff1a;输出窗口归类使用&#xff0c;你写什么它就显示什么 参数2&#x…

网络安全入门必选:十款免费的抓包工具有哪些?

下面给大家推荐几款好用的免费的抓包工具软件&#xff0c;有需要的小伙伴们来了解一下。 1. Wireshark抓包分析工具 4.0.1 Wireshark是一款功能强大的网络协议分析器&#xff0c;可以实时检测和抓取网络通讯数据。它支持多种协议和媒体类型&#xff0c;并具备丰富的显示过滤…