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.rhkb.cn/news/362506.html

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

相关文章

PyCharm 2024.1最新变化

PyCharm 2024.1 版本带来了一系列激动人心的新功能和改进&#xff0c;以下是一些主要的更新亮点: Hugging Face 模型和数据集文档预览&#xff1a;在 PyCharm 内部快速获取 Hugging Face 模型或数据集的详细信息&#xff0c;通过鼠标悬停或使用 F1 键打开文档工具窗口来预览。 …

句法分析概述

第1关&#xff1a;句法分析概述 任务描述 本关任务&#xff1a;通过对句法分析基本概念的学习&#xff0c;完成相应的选择题。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 句法分析的基础概念&#xff1b; 句法分析的数据集和评测方法。 句法分析简介…

使用nvm命令进行node和npm版本下载以及切换

下载以及安装nvm方式 https://blog.csdn.net/ppz8823/article/details/130862191 1.查看nvm版本 nvm -v2.查看node 和 npm版本 node -v npm -v3.使用nvm查看已下载的node版本 nvm ls4.使用nvm 查看可使用的在线node版本 nvm list available4.下载想要使用的node版本&#x…

前端-echarts tooltip展示多项自定义数据

效果如图&#xff0c;鼠标滑动到某一个柱子的时候&#xff0c;出现这一项数据的多个自定义数据&#xff0c;外加自己的模板样式渲染。 希望能展示每一列中的多个自定义数据 代码部分 主要是在data中&#xff0c;value就是实际展示的主数据&#xff0c;其他字段名为自定义的数…

基于springboot时装购物系统

设计技术&#xff1a; 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatisvue 工具&#xff1a;IDEA、Maven、Navicat 主要功能&#xff1a; 管理员&#xff1a;首页、个人中心、用户管理、商品分类管理、颜色管理、商品信息管理、商品评价…

Swift开发——简单App设计

App的界面设计需要具有大量的图像并花费大量的时间,这样的应用不方便学习和交流,这里重点介绍SwiftUI界面元素的用法,通过简单App设计过程的讲解,展示图形用户界面应用程序的设计方法。 01、简单App设计 按照9.1节工程MyCh0901的创建方法,创建一个新的工程MyCh0902,此时工…

【Unity | Editor强化工具】项目备忘录工具

经常会被美术和策划同事反复询问某几个问题&#xff0c;每次都要翻Wiki链接给他们&#xff0c;非常折磨人&#xff0c;所以做了个可以在Unity内部显示备忘录的小工具&#xff0c;能够减少一些查找成本&#xff08;另外我觉得&#xff0c;让他们养成查看Unity内触手可及的信息的…

用MySQL和navicatpremium做一个项目—(财务管理系统)。

1 ER图缩小的话怕你们看不清&#xff0c;所以截了两张图 2 vsdx绘图结果 3DDL和DML,都有点长分了好多次上传&#xff0c;慢慢看 DDL -- 用户表 CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用…

【stm32-新建工程-HAL库版本】

stm32-新建工程-HAL库版本 ■ 1. 下载STM32Cube官方固件包&#xff08;F1/F4/F7/H7&#xff09;■ 2. 新建HAL库版本MDK工程所需的文件夹■ 2.1 新建工程文件- XXX项目并在下面新建如下文件夹■ 2.2 向Drivers文件添加如下文件■ 2.3 向Mrddlewares文件添加文件■ 2.4 设置Outp…

YouCompleteMe插件安装方法简述

一、前言 YouCompleteMe是VIM中进行C/C 开发的重要工具&#xff0c;可以极大提升linux下C/C开发效率。 YCM需要高版本的gcc (8.0以上版本&#xff0c;支持C17) 和 vim&#xff08;8.0以上&#xff0c;支持python3.6以上&#xff09; 二、编译gcc_8.3 1. 获取源码 wget https:…

重磅消息:ONLYOFFICE8.1版本桌面编辑器发布:功能完善的 PDF 编辑器、幻灯片版式、改进从右至左显示、新的本地化选项等

目录 ONLYOFFICE介绍 PDF 编辑器 功能全面的 PDF 编辑器 文本编辑 页面处理 &#xff08;添加、旋转、删除&#xff09; 插入和调整各种对象&#xff0c;例如表格、形状、文本框、图像、TextArt、超链接、方程等。 此外 PDF 表单 文本文档编辑器更新内容 页面颜色 页面…

浅析Resource Quota中limits计算机制

前言 在生产环境中&#xff0c;通常需要通过配置资源配额&#xff08;Resource Quota&#xff09;来限制一个命名空间&#xff08;namespace&#xff09;能使用的资源量。在资源紧张的情况下&#xff0c;常常需要调整工作负载&#xff08;workload&#xff09;的请求值&#xf…

pytorch十大核心操作

PyTorch的十大核心操作涵盖了张量创建、数据转换、操作变换等多个方面。以下是结合参考文章信息整理出的PyTorch十大核心操作的概述&#xff1a; 张量创建&#xff1a; 从Python列表或NumPy数组创建张量。使用特定值创建张量&#xff0c;如全零、全一、指定范围、均匀分布、正…

Python (Ansbile)脚本高效批量管理服务器和安全

1、简介 在现代 IT 基础设施中&#xff0c;管理大量服务器是一项复杂而繁琐的任务。特别是在检查服务器的存活状态以及 SSH 登录等任务上&#xff0c;手动操作非常耗时且容易出错。本文将介绍如何使用 Python 脚本实现对多台服务器的批量检查和管理&#xff0c;包括检查服务器…

【应届应知应会】Linux常用指令

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8;友情提供 目录 文件与目录管理 目录操作命令&#xff1a; ls [选项] [目录或文件] mkdir 文件操作命令&#xf…

幻兽帕鲁Palworld樱花版本服务器一键开服联机

1、登录服务器&#xff08;百度莱卡云&#xff09; 1.1、第一次购买服务器会安装游戏端&#xff0c;大约5分钟左右&#xff0c;如果长时间处于安装状态请联系客服 2、在启动中调整游戏参数 2.1、重启服务器&#xff0c;等待running出现&#xff0c;或者运行时间变为灰色&#x…

vue 组件下 img 标签动态传入不展示

效果 解决办法&#xff1a; require() <titleComponent:title"业务工作概览":src"require(/assets/imgs/evaluation/overviewStatistics.png)"></titleComponent> 效果&#xff1a;

Python输入与输出基础

Python输入与输出基础 引言 Python是一种非常直观且功能强大的编程语言&#xff0c;它允许用户轻松地处理输入和输出操作。无论是从用户那里获取数据&#xff0c;还是将结果展示给用户&#xff0c;Python都提供了简单易用的函数和方法。 一、输入数据 在Python中&#xff0c…

为什么javaer认为后台系统一定要用java开发?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;公司有两个开发团队&#xf…

【智能算法应用】麻雀搜索算法在物流配送中心选址的应用(无待选配送中心)

目录 1.算法原理2.数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.数学模型 模型假设 待定物流配送中心的库存总能满足需求点的需求不考虑从工厂到待定物流配送中心的运输成本不考虑选定区域内待确定…