this和static和const关键字

1. this指针

1.1 基本认识

C++中成员函数的特性,在类的非静态成员函数中都会存在一个this指针,来指向当前类,它是隐式的不可见的,是作为函数的第一个参数可以通过this指针来解决二义性的问题

是的,this指针是与类的实例相关联的。在C++中,this指针是一个指向当前对象的指针,它在类的成员函数内部自动存在。它允许在类的成员函数中引用当前对象的成员变量和成员函数。当你调用一个类的成员函数时,编译器会隐式传递一个指向当前对象的this指针给该成员函数。这使得成员函数可以访问和操作当前对象的成员。

this指针原型:类名    *   const   this ; //this指针的原型
例如:People  *  const  this;

1.2 将this指针作为函数返回值使用:

格式:

类名     &  函数名 ([参数列表])

{

//函数具体实现

return   *this;   //通过该函数将当前对象进行返回

}

main6.cpp

#include "iostream"
using namespace std;//this指针
class People
{
public:People(int a)//构造函数{this->a = a;}//成员函数void print(){cout << "a=" << this->a << endl;cout << "hello world" << endl;}//得到对象People& get_duiXiang(){this->a = 60;return *this;}private:int a = 10;
};int main()
{//直接调用对象输出People people(10);people.print();cout << endl;//使用this 返回获得对象,输出People p2 = people.get_duiXiang();p2.print();return 0;
}

2. static关键字

重点

它们不是与特定对象相关联的,而是与整个类相关联的,当static用于类的成员变量时,它表明这个变量是与整个类相关联,而不是与类的每个实例关联。

因为C++编译器必须确保只有一个唯一的静态成员变量存在,而不是为每个类的实例都有一个副本

C++提供的static关键字主要应用于类的成员,对于不是类的成员与C语言的作用是类似

对于类的静态成员讲,它是类的所有对象共享一份,它不是某个对象所特有的

2.1 static声明成员变量

2.1.1 静态成员变量初始化细节

用static声明的成员变量是存储在静态全局区,即全局变量

在C++中不能直接对静态成员变量进行初始化,在类外对它进行初始化

变量的初始化
类外初始化格式:类型   类名  ::  变量名  =  初始值; //在类外初始化
例如:int   People ::  number = 10;   //在类外初始化static声明静态成员函数
格式:static   返回值类型   函数名 (参数列表){}
例如:static  int  get_value(){}

详解

在C++中,静态成员变量(使用static关键字修饰的成员变量)是类的成员,而不是类的实例成员。因此,它们不是与特定对象相关联的,而是与整个类相关联的。由于静态成员变量不属于特定对象,不能在类的内部初始化它们。

相反,你需要在类的外部(通常是在源文件中)对静态成员变量进行初始化。这是因为C++编译器必须确保只有一个唯一的静态成员变量存在,而不是为每个类的实例都有一个副本

通常,静态成员变量的初始化会在源文件中进行,如下所示:

main5.cpp
//static 修饰的成员变量的初始化
class MyClass {
public:static int staticVar;
};// 在类的外部初始化静态成员变量
int MyClass::staticVar = 42;int main() {cout << MyClass::staticVar << endl;return 0;
}

2.2 类的静态成员的访问方式及其特性

2.2.1 可以通过类的对象进行访问

例如:

People people;

people.function();//这种方式访问

2.2.2 可以通过类进行访问

符号:“  :: 

格式:

类名  :: 静态成员名 ;

例如:

People  ::   function();

main5.cpp
//static关键字,成员的访问方式
class People1
{
public:void get_value()//非静态成员函数{cout << "非静态成员函数访问非静态成员变量a=" << this->a << endl;get_static_value();// 非 静态成员函数 可以 访问 静态成员函数this->a = 100;cout << "非静态成员函数访问变量a=" << this->a << endl;}static void get_static_value()//静态成员函数{cout << "静态成员函数" << endl;//cout << "非静态成员变量a=" << a << endl; //静态成员函数 不可以 访问 非静态成员变量cout << "静态成员变量b=" << b << endl; //静态成员函数 可以 访问 静态成员变量b = 100;//修改静态成员的值cout << "静态成员变量b=" << b << endl; //静态成员函数 可以 访问 静态成员变量}int a = 10;static int b;//类中定义了静态成员变量};
int People1::b = 50;//在类的外部初始化静态成员变量int main()
{People1::get_static_value(); //使用 :: 访问静态成员函数cout << "静态成员变量b=" << People1::b << endl;cout << endl;//以下是研究静态成员的一些特性People1 people1;//观察以下两次打印非静态的a地址变了,而静态的b虽然对象不同但是地址还是一样,说明静态成员只针对类说话 而不针对 对象cout << "变量a的地址:" << &people1.a << endl;//变量a的地址:00000058B67AFB04cout << "变量b的地址:" << &people1.b << endl; //变量b的地址:00007FF7D0D6E000cout << endl;People1 people2;cout << "变量a的地址:" << &people2.a << endl;//变量a的地址:00000058B67AFB04cout << "变量b的地址:" << &people2.b << endl; //变量b的地址:00007FF7D0D6E000return 0;
}

2.3 静态函数的注意事项知识点(面试高频):

2.3.1 静态成员函数中是否有this指针?

答案:没有

为什么?

我的回答

因为静态成员存存储在静态全局区,可以理解为跟类都不在一个地方存储,而this又是针对类的实列,static只与类本身关联,所以静态成员函数中不可能有this指针

专业回答

在C++中,静态成员函数没有隐式的 this 指针。这是因为静态成员函数是与类本身关联,而不是与类的实例(对象)关联的。this 指针是用于指向调用成员函数的对象的指针,但是在静态成员函数中,并没有特定的实例对象,因此没有 this 指针。

2.3.2 静态成员函数调用非静态成员?静态成员?

答案:不能调用非静态成员,可以调用静态成员

专业回答

静态成员函数可以调用静态成员,但不能直接访问非静态成员,这是因为它们都属于类而不是特定的对象实例,静态成员函数不依赖于特定的对象实例,非静态成员变量和非静态成员函数在静态成员函数内部是不可访问的,因为它们需要一个具体的对象实例来操作。

main5.cpp
//静态成员不能调用非静态成员,可以调用静态成员
class MyClass {
public:static int staticVar;  // 静态成员变量int regularVar;        // 非静态成员变量MyClass() : regularVar(60) //构造{}//静态函数static void staticFunction() {// 静态成员函数可以调用静态成员变量cout << "静态成员函数 可以调用 静态成员变量: " << staticVar << endl;// 但不能直接访问非静态成员变量//std::cout << "非 静态成员变量 " << regularVar << std::endl;}//非 静态成员函数void regularFunction() {// 非静态成员函数可以调用静态成员变量和非静态成员变量std::cout << "非静态成员函数 可以调用 静态成员变量: " << staticVar << std::endl;std::cout << "非静态成员函数 可以调用 非静态成员变量 " << regularVar << std::endl;cout << endl;// 可以调用静态成员函数staticFunction();}
};// 静态成员变量的初始化
int MyClass::staticVar = 42;int main() {MyClass obj;// 调用静态成员函数MyClass::staticFunction();// 调用非静态成员函数obj.regularFunction();return 0;
}

2.3.3非静态成员函数调用非静态成员?静态成员?

非静态成员函数可以调用非静态成员和静态成员,因为非静态成员函数是与类的实例相关联的,可以访问该实例的所有成员(包括非静态和静态成员)。

3. const关键字

用const修饰类的成员,就表示成员是不可变,例如:修饰成员变量 , 变量是常量属性

C++中用const修饰类的成员函数,表示成员函数是对类的成员以只读的性质(保护数据成员)

格式:函数返回值类型     函数名  ([参数列表]) const{}
例如:void   function() const{}

main7.cpp

#include <iostream>
using namespace std;//用const修饰类的成员函数,表示成员函数是对类的成员以只读的性质(保护数据成员)
class MyClass {
public://构造MyClass() : dataMember(60) {}// 非常量成员函数,可以修改数据成员void modifyDataMember(int newValue) {dataMember = newValue;}// 带有const修饰符的成员函数,只读访问数据成员void readDataMember() const {// 不能在const成员函数中修改数据成员//dataMember = 10;cout << "Data member value: " << dataMember << endl;}private:int dataMember;
};int main() {MyClass obj;  // 创建一个常量对象//使用不带const修饰的函数修改成员变量的值obj.modifyDataMember(10);// 通过常量对象调用只读成员函数obj.readDataMember();// 不能通过常量对象调用非常量成员函数// const MyClass obj2; // obj2.modifyDataMember(10);return 0;
}

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

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

相关文章

最快速度与最简代码搭建卷积神经网络,并快速训练模型,每日坚持手撕默写代码

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下最快速度与最简代码搭建卷积神经网络&#xff0c;并快速训练模型&#xff0c;每日坚持手撕默写代码。随着人工智能的快速发展&#xff0c;去年有强大的大模型ChatGPT横空出世&#xff0c;国内的大模型也紧追其后的发…

写一个java状态模式的详细实例

以下是一个示例的 Java 状态模式实现&#xff1a; java Copy code // 定义状态接口 interface State { void handleState(Context context); } // 具体状态类 1 class ConcreteState1 implements State { public void handleState(Context context) { System…

基于ssm西安旅游管理系统论文

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对西安旅游信息管理的提升&#x…

JavaScript----字符串拼接

1、字符串拼接 字符串拼接使用: "" 运算符 var iNum1 10; var fNum2 11.1; var sStr abc;result iNum1 fNum2; alert(result); // 弹出21.1result fNum2 sStr; alert(result); // 弹出11.1abc说明 数字和字符串拼接会自动进行类型转换(隐士类型转换)&#…

使用pandas绘图,并保存,支持中文

使用pandas绘图&#xff0c;并保存&#xff0c;支持中文 支持中文标题绘图创建DataFrame绘制图形添加其他绘图细节保存图形显示图形 支持中文标题 import matplotlib.pyplot as plt from matplotlib.font_manager import FontProperties import matplotlib.font_manager as fm…

深入理解Java集合框架

导语&#xff1a; Java集合框架是Java提供的一组用于管理对象的类和接口&#xff0c;它是Java编程中非常重要的一部分。Java集合框架通过提供诸如List、Set、Map等数据结构&#xff0c;为程序员提供了一种方便、高效的管理对象的方式。本文将深入理解Java集合框架&#xff0c;包…

RuntimeError: “slow_conv2d_cpu“ not implemented for ‘Half‘

目录 临时解决方法&#xff1a; RuntimeError: "slow_conv2d_cpu" not implemented for Half train_lora.py中&#xff1a; 原因&#xff1a;cpu不支持fp16类型&#xff0c; 临时解决方法&#xff1a; 注释掉fp16模式&#xff0c; weight_dtype torch.float32i…

Mediapipe绘制实时3d铰接骨架图——Mediapipe实时姿态估计

一、前言 大约两年前&#xff0c;基于自己的理解我曾写了几篇关于Mediapipe的文章&#xff0c;似乎帮助到了一些人。这两年&#xff0c;忙于比赛、实习、毕业、工作和考研。上篇文章已经是一年多前发的了。这段时间收到很多私信和评论&#xff0c;请原谅无法一一回复了。我将尝…

Redis缓存与数据库如何保证一致性

数据库和缓存如何保证一致性&#xff1f; 目录 数据库和缓存如何保证一致性&#xff1f;背景方案先更新数据库&#xff0c;还是先更新缓存&#xff1f;先更新数据库&#xff0c;再更新缓存先更新缓存&#xff0c;再更新数据库 先更新数据库&#xff0c;还是先删除缓存&#xff…

安装 PyQt5 保姆级教程

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 前言 博主之前做应用层开发用的一直是 Qt&#xff0c;这次尝试一下在 python 中使用 Pyqt5 模块来开发 UI 界面&#xff0c;这里做一些…

certum的ip证书购买流程

Certum是成立于欧洲的CA认证机构&#xff0c;经过二十几年的发展Certum已经成为欧洲知名的CA认证机构之一&#xff0c;拥有广泛的客户群体和合作伙伴。IP证书是Certum为只有公网IP地址的网站准备的数字加密服务。今天就随SSL盾小编了解购买Certum旗下的IP证书流程。 第一步&am…

WPF Grid

Resource 在 WPF 中&#xff0c;“Grid” 是一种用于布局的面板控件&#xff0c;而 “Resource” 是一种用于定义可重用对象的机制。您可以将资源定义为 Grid 控件的一部分&#xff0c;以便在整个应用程序中共享和重用。 使用资源可以帮助您简化界面的创建和维护。在 Grid 控件…

总结一些好用的函数

1. <string.h>/<cstring>头文件 中的 memset函数 作用&#xff1a;用于将一段内存区域设置为特定的值(它作用的基本单位是字节) 可以对变量&#xff0c;数组&#xff08;一维数组和二维数组&#xff09;&#xff0c;结构体进行初始化&#xff0c;但是不能对vecto…

数据库进阶教学——读写分离(Mycat1.6+Ubuntu22.04主+Win10从)

目录 1、概述 2、环境准备 3、读写分离实验 3.1、安装jdk 3.2、安装Mycat 3.3、配置Mycat 3.3.1、配置schema.xml ​​​​3.3.2、配置server.xml 3.4、修改主从机远程登陆权限 3.4.1、主机 3.4.2、从机 3.5、启动Mycat 3.6、登录Mycat 3.7、验证 1、概述 读写分…

如何合理配置云服务器的CPU和内存?

​  提到云服务器性能&#xff0c;大抵有两个主要影响因素&#xff0c;CPU 核心数量和内存容量 &#xff0c;它们决定了云服务器的速度和可靠性。日常运用中&#xff0c;我们如何判断网站需要需要更多或更少?如何扩大或缩小它们以优化网站的性能? 一般来说&#xff0c;您拥…

视频遥测终端机的设计需求

目录 1.目的 2.参考文件 3.总体描述 4.硬件资源描述 4.1微控制单元 4.2视频处理单元 4.3性能指标 5.功能要求 5.1系统参数要求 5.1.1系统管理 5.1.2系统配置 5.1.2.1一般参数 5.1.2.2编码参数 5.1.2.3网络参数 5.1.2.4网络服务 5.1.2.5OSD参数 5.1.2.6抓拍 5.…

java设计模式学习之【访问者模式】

文章目录 引言访问者模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用电脑示例代码地址 引言 设想你是一个艺术馆的管理员&#xff0c;艺术馆里有各种各样的艺术品。每当有游客来访时&#xff0c;根据他们的兴趣&#xff0c;他们可能只想看画、雕塑或特定的…

【开源】基于Vue+SpringBoot的房屋出售出租系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 房屋销售模块2.2 房屋出租模块2.3 预定意向模块2.4 交易订单模块 三、系统展示四、核心代码4.1 查询房屋求租单4.2 查询卖家的房屋求购单4.3 出租意向预定4.4 出租单支付4.5 查询买家房屋销售交易单 五、免责说明 一、摘…

华为云服务器重启后无法连接故障解决

华为云服务器系统为麒麟银河V10sp1&#xff0c;升级sp1.1后继续升级sp2. 升级后重启发现无法连接服务器了。 登录华为云控制台&#xff0c;使用用vnc方式连接成功。 推测应该是网络问题。使用ip addr命令检查&#xff0c;发现网卡eth0处于down状态。 使用命令启动网卡&…

spring security oauth2搭建认证服务器

如图&#xff08;上面图片的代码在业务项目中&#xff09;&#xff0c;第一步在独立的业务项目中&#xff0c;先获取授权码&#xff08;也叫jsessionId&#xff09;、获取授权码的路径就是 /oauth2/authorize&#xff0c;这个路径是oauth2的框架中被OAuth2AuthorizationEndpoin…