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.mzph.cn/diannao/36557.shtml

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

相关文章

python OpenCV 库中的 cv2.Canny() 函数来对图像进行边缘检测,并显示检测到的边缘特征

import cv2# 加载图像 image cv2.imread(4.png)# 使用 Canny 边缘检测算法提取边缘特征 edges cv2.Canny(image, 100, 200)# 显示边缘特征 cv2.imshow(Edges, edges) cv2.waitKey(0) cv2.destroyAllWindows() 代码解析&#xff1a; 导入 OpenCV 库&#xff1a; import cv2加…

PT100(RTD)是什么?2线,3线,4线原理

RTDs - or Resistance Temperature Detectors- (电阻式温度探测器)&#xff0c;是温度型传感器&#xff0c;包含一个电阻&#xff0c;这个阻值可以随温度的变化而变化。在工业的进程中和实验室里已经使用了很多年&#xff0c;以精确&#xff0c;可靠和稳定的特性。 2线制 2线制…

C语言| 数组元素的删除

同数组元素的插入差不多。 数组元素的插入&#xff0c;是先移动要插入元素位置后面的所有元素&#xff0c;再插入新元素&#xff0c;长度1。 C语言| 数组的插入-CSDN博客 数组元素的删除&#xff0c;是先删除元素&#xff0c;再把后面的元素往前移动一位&#xff0c;而本程序…

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

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

Vue 解决报错 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise‘

Vue 报错 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise’ 排查 控制台报了一个错误 , Uncaught SyntaxError: Unexpected identifier ‘Promise’&#xff0c;网上查到的方法是 缺少符号&#xff0c;语法写法错误&#xff0c;但这些都没有解决我的问题&am…

RTDETR更换优化器——Lion

RTDETR更换Lion优化器 论文&#xff1a;https://arxiv.org/abs/2302.06675 代码&#xff1a;https://github.com/google/automl/blob/master/lion/lion_pytorch.py 简介&#xff1a; Lion优化器是一种基于梯度的优化算法&#xff0c;旨在提高梯度下降法在深度学习中的优化效果…

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

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

prompt:我是晚餐盲盒,只要你问出“今晚吃什么”我就将为你生成美妙的食物推荐。

使用方法&#xff1a;在ChatGP粘贴下面提示词模型&#xff0c;点击输出。然后再问“晚餐有什么好吃的&#xff1f;”&#xff0c;AI输出丰种食物供你选择。抽到什么吃什么&#xff0c;极大的解决选择困难的问题。 客户需要生成1000条俏皮灵动&#xff0c;趣味盎然&#xff0c;比…

pytest测试框架pytest-order插件自定义用例执行顺序

pytest提供了丰富的插件来扩展其功能&#xff0c;本章介绍插件pytest-order&#xff0c;用于自定义pytest测试用例的执行顺序。pytest-order是插件pytest-ordering的一个分支&#xff0c;但是pytest-ordering已经不再维护了&#xff0c;建议大家直接使用pytest-order。 官方文…

华为云安全防护,九河云综合分解优劣势分析

随着全球化的发展&#xff0c;越来越多的企业开始寻求在国际市场上扩展业务&#xff0c;这一趋势被称为企业出海。然而&#xff0c;企业在海外扩张面临诸多隐患与安全挑战&#xff0c;其中因为地域的不同&#xff0c;在安全性方面与国内相比会变得薄弱&#xff0c;从而导致被黑…

如何在浏览器中查看网页的HTML源代码?

如何在浏览器中查看网页的HTML源代码&#xff1f; 浏览html网页&#xff0c;查看其源代码&#xff0c;可以帮助我们了解该版网页的信息以及架构&#xff0c;每个浏览器都是允许用户查看他们访问的任何网页的HTML源代码的。以下编程狮小师妹就介绍几个常见浏览器的查看网页 HTM…

mysql安装创建数据库防止踩坑

为了安装MySQL的家人们走弯路&#xff0c;稍微有些啰嗦&#xff0c;讲述我安装的时遇到的问题&#xff0c;如何解决。仔细看看离成功不远。 mysql下载链接 MySQL :: Download MySQL Community Server windows下安装mysql-8.0.29-winx64&#xff0c;下载安装包后解压到文件夹中…

C语言 | Leetcode C语言题解之第191题位1的个数

题目&#xff1a; 题解&#xff1a; int hammingWeight(uint32_t n) {int ret 0;while (n) {n & n - 1;ret;}return ret; }

Windows安装jdk配置环境变量(基础)

一、下载安装JDK 下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/?er221886#java8-windows 因为JDK8比较稳定&#xff0c;所以建议选择这个。电脑32位的下载jdk-8u411-windows-i586.exe&#xff1b;电脑是64位的下载jdk-8u411-windows-x64.exe 1、…

链动2+1模型:驱动用户增长与业务提升的新引擎

大家好&#xff0c;我是吴军&#xff0c;来自一家业界领先的科技创新公司。在今天&#xff0c;我想与大家分享一个在我们业务中取得显著成果的运营策略——链动21模型&#xff0c;以及它是如何助力我们优化用户满意度&#xff0c;提高用户粘性和促进复购率的。 尽管链动模式在业…

安装Flask

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 大多数Python包都使用pip实用工具安装&#xff0c;使用Virtualenv创建虚拟环境时会自动安装pip。激活虚拟环境后&#xff0c;pip 所在的路径会被添加…

计算机组成原理——系统总线

题目:计算机使用总线结构便于增减外设,同时__C____。 A.减少了信息传送量 B.提高了信息传输速度 C.减少了信息传输线的条数 1. 总线的分类 1.1. 片内总线 芯片内部的总线 在CPU芯片内部,寄存器与寄存器之间、寄存器与逻辑单元ALU之间 1.1.1. 数据总线 双向传输总线 数…

麒麟系统安装Redis

一、背景 如前文&#xff08;《麒麟系统安装MySQL》&#xff09;所述。 二、下载Redis源码 官方未提供麒麟系统的Redis软件&#xff0c;须下载源码编译。 下载地址&#xff1a;https://redis.io/downloads 6.2.14版本源码下载地址&#xff1a;https://download.redis.io/re…

生成随机函数f3,利用f3生成f18(python)

一、题目 给定一个完全随机函数f3。能够完全随机产生1~3之间任意一个自然数。现在要构造一个f18&#xff0c;让其能随机产生1~18之间任意一个自然数&#xff0c;要求写出f18的函数&#xff0c;另外要测试是否符合预期&#xff0c;f18要用f3 二、代码 欢迎大家给我更优解&…

mac 安装mysql启动报错 ERROR!The server quit without update PID file

发现问题&#xff1a; mac安装mysql初次启动报错&#xff1a; 一般出现这种问题&#xff0c;大多是文件夹权限&#xff0c;或者以前安装mysql卸载不干净导致。首先需要先确定问题出在哪&#xff1f;根据提示我们可以打开mysql的启动目录&#xff0c;查看启动日志。 问题解决&a…