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

文章目录

  • 一、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.mfbz.cn/a/751067.html

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

相关文章

【2024.6.23】今日科技时事:科技前沿大事件

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

最新!AI大模型的研究热点!

引言 在人工智能的浪潮中&#xff0c;大模型研究如日中天&#xff0c;涵盖诸多研究方向&#xff0c;每个方向均承载着独特的研究焦点与挑战。 以下&#xff0c;我们将逐一探讨数个备受瞩目的研究方向&#xff0c;包括检索增强生成RAG、大模型Agent、Mamba、MoE、LoRA等&#…

【LeetCode】八、堆的使用:第K个最大元素 + 前K和高频单词

文章目录 1、Java中的堆结构2、leetcode215&#xff1a;数组中的第K个最大元素3、leetcode692&#xff1a;前K个高频单词 1、Java中的堆结构 PriorityQueue类取堆顶元素删除堆顶元素堆的元素个数遍历堆 2、leetcode215&#xff1a;数组中的第K个最大元素 这题应该快排来解&…

MyBatis~配置解析, 属性(properties)、设置(settings)

注意, 对应的名称一定要相同, 比如username就要对应username, 而且如果同时使用外部配置文件和property, 优先级是外部配置文件优先级更高 设置&#xff08;settings&#xff09; 这是 MyBatis 中极为重要的调整设置&#xff0c;它们会改变 MyBatis 的运行时行为。 下表描述了…

利用Python控制终端打印字体的颜色和格式

利用Python控制终端打印字体的颜色和格式—操作详解&#xff08;ANSI转义序列&#xff09; 一、问题描述二、ANSI转义序列三、具体代码和显示效果&#xff08;看懂这段代码&#xff0c;以后可随心控制字体的打印格式&#xff09; 欢迎学习交流&#xff01; 邮箱&#xff1a; z……

Linux系统相关函数总结

在应用程序当中&#xff0c;有时往往需要去获取到一些系统相关的信息&#xff0c;譬如时间、日期、以及其它一些系统相关信息&#xff0c;本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取这些系统信息。除此之外&#xff0c;还会向大家介绍 Linux 系统下的/proc 虚拟文…

Android 13 为应用创建快捷方式

参考 developer.android.google.cn 创建快捷方式 来自官网的说明&#xff1a; 静态快捷方式 &#xff1a;最适合在用户与应用互动的整个生命周期内使用一致结构链接到内容的应用。由于大多数启动器一次仅显示四个快捷方式&#xff0c;因此静态快捷方式有助于以一致的方式执行…

TikTok API接口——获取视频评论信息

一、引言 TikTok&#xff0c;作为全球最受欢迎的短视频社交平台之一&#xff0c;不仅为用户提供了展示才华和分享生活的舞台&#xff0c;也为品牌和企业提供了与年轻用户互动的新渠道。在这个信息爆炸的时代&#xff0c;了解用户的声音、掌握舆论动向显得尤为重要。通过TikTok…

uview中的utabs组件item字数不一致导致滑块偏移

给item单独设置宽度&#xff0c;使滑块计算准确 ::v-deep .u-scroll-box .u-tab-item {width: 80px !important;&:nth-child(3),&:nth-child(4),&:nth-child(5) {width: 60px !important;}flex: 1 1 0% !important; }效果如下&#xff1a;

【TOOL】ceres学习笔记(一) —— 教程练习

文章目录 一、Ceres Solver 介绍二、Ceres 使用基本步骤1. 构建最小二乘问题2. 求解最小二乘问题 三、使用案例1. Ceres Helloworld2. Powell’s Function3. Curve Fitting4. Robust Curve Fitting 一、Ceres Solver 介绍 Ceres-solver 是由Google开发的开源C库&#xff0c;用…

吐血推荐!3款视频生成工具,全部国产,都免费

AI视频大模型的爆发&#xff0c;让创作爆款视频不再是专业人士的能力。 今天二师兄给大家推荐3款免费的视频生成工具。 01 可灵 推荐指数 &#xff1a; 五颗星 先看效果 可灵大模型测试 可灵大模型是快手AI团队自主研发的视频生成大模型&#xff0c;具备强大的视频创作能力&a…

大数据开发需要哪些职场知识

职场是个人情世故的江湖&#xff0c;除了专业技能&#xff0c;成功的大数据开发人员还需要掌握多种职场知识。以下是一些重要的职场知识和技能&#xff0c;结合实际例子详细说明。 目录 理论知识与工程实践理论知识工程实践例子 项目经验总结项目管理总结和反思例子 做事方式方…

【python】OpenCV—Color Map

文章目录 cv2.applyColorMapcv2.putText小试牛刀自定义颜色 参考学习来自 OpenCV基础&#xff08;21&#xff09;使用 OpenCV 中的applyColorMap实现伪着色 cv2.applyColorMap cv2.applyColorMap() 是 OpenCV 中的一个函数&#xff0c;用于将灰度图像或单通道图像应用一个颜色…

《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID Controllers》

期刊&#xff1a;CVPR 年份&#xff1a;2023 代码&#xff1a;https://github.com/XuJiacong/PIDNet 摘要 双分支网络架构已经证明了它在实时语义分割任务中的有效性和有效性。然而&#xff0c;高分辨率细节和低频上下文的直接融合的缺点是细节特征很容易被周围的上下文信息…

Qt开发 | Qmake与CMake | Qt窗口基类 | VS Qt项目与QtCreator项目相互转化 | Qt架构 | Qt学习方法

文章目录 一、Qmake与CMake介绍1.Qmake2.CMake3.使用qmake还是cmake&#xff1f; 二、Qt3个窗口基类的区别三、vs qt与QtCreator项目相互转化方法1.QtCreator项目转VS Qt2.VS Qt项目转QtCreator项目 四、Qt架构介绍与学习方法详解 一、Qmake与CMake介绍 Qmake和CMake都是构建系…

vue启动时的错误

解决办法一&#xff1a;在vue.config.js中直接添加一行代码 lintOnSave:false 关闭该项目重新运行就可启动 解决办法二&#xff1a; 修改组件名称

机械装备制造行业MES,实时监控生产流程

装备制造行业MES&#xff0c;是专门为装备制造行业设计的生产信息化管理系统。旨在实时监控装备制造生产流程&#xff0c;实现全流程的精细化管理和监控&#xff0c;提高生产效率、降低生产成本、提升产品质量。 本文将详细介绍装备制造行业MES的概念、技术及应用&#xff0c;…

放大招了|十亿参数大模型LLMs运行功耗仅需13W,内存使用量减少90%!

矩阵乘法&#xff08;MatMul&#xff09;历来是大型语言模型&#xff08;LLMs&#xff09;总体计算成本的主导因素&#xff0c;尤其在模型向更大维度嵌入和上下文长度发展时&#xff0c;这一成本呈指数级增长。 近期有一篇刚刚发表的论文中提出的方法完全去除了矩阵乘法操作&am…

系统架构师考点--系统配置与性能评价

大家好。今天我们来总结一下系统配置与性能评价的考点内容&#xff0c;这一部分一般是出在上午场的选择题中&#xff0c;占1-2分左右。 一、性能指标 计算机 对计算机评价的主要性能指标有&#xff1a;时钟频率(主频)&#xff1b;运算速度&#xff1b;运算精度内存的存储容量…