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;国内的大模型也紧追其后的发…

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

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

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…

数据库进阶教学——读写分离(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 查询买家房屋销售交易单 五、免责说明 一、摘…

spring security oauth2搭建认证服务器

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

如何从RTP包的AP类型包,获取h265的PPS、SPS、VPS信息

ffmpeg播放rtp流&#xff0c;为了降低首开延迟&#xff0c;需要在SDP文件中指定PPS、SPS、VPS信息。抓包后发现wireshark无法解析AP包。需要自己进行AP包解析。RTP协议AP包格式如下&#xff1a; 根据如上信息&#xff0c;我们可以解析AP包&#xff0c;效果如下 40 01&#xff…

图像质量评估:使用 SSIM 计算图像相似性

在图像处理领域&#xff0c;衡量两幅图像之间相似性的一种常见方法是使用结构相似性指数&#xff08;SSIM&#xff09;。SSIM 是一种全参考的图像质量评估指标&#xff0c;它不仅考虑了图像的亮度、对比度&#xff0c;还考虑了结构信息。在本文中&#xff0c;我们将介绍一个使用…

【Vue2+3入门到实战】(13)插槽<slot>详细示例及自定义组件的创建与使用代码示例 详解

目录 一、学习目标1.插槽2.综合案例&#xff1a;商品列表 一、插槽-默认插槽1.作用2.需求3.问题4.插槽的基本语法5.代码示例6.总结 二、插槽-后备内容&#xff08;默认值&#xff09;1.问题2.插槽的后备内容3.语法4.效果5.代码示例 三、插槽-具名插槽1.需求2.具名插槽语法3.v-s…

【JAVA】使用OPENGL

从这个网址下载对应的库&#xff1a; LWJGL - Lightweight Java Game Libraryhttps://www.lwjgl.org/browse/release/3.3.3下载这个压缩包&#xff08;实际上有很多版本3.3.3是比较新的版本&#xff1a;LWJGL - Lightweight Java Game Library&#xff09;&#xff1a; https…

关于log4j的那些坑

背景&#xff1a;工程中同时存在log4j.xml&log4j2.xml maven依赖如下&#xff1a; 此时工程实际使用的日志文件为log4j.xml 1、当同时设置log4j和log4j2的桥接依赖时 maven依赖如下&#xff1a; 此时启动会有警告日志&#xff1a; 点击告警日志链接&#xff1a;https://…

【Vue2 + ElementUI】el-table中校验表单

一. 案例 校验金额 阐述&#xff1a;校验输入的金额是否正确。如下所示&#xff0c;点击【编辑图标】会变为input输入框当&#xff0c;输入金额。当输入框失去焦点时&#xff0c;若正确则调用接口更新金额且变为不可输入状态&#xff0c;否则返回不合法金额提示 <templat…

计算机网络复习4

网络层——点到点 文章目录 网络层——点到点功能路由算法IPV4NAT 网络地址转换子网划分与子网掩码、CIDR地址解析协议ARP&#xff1a;根据IP地址找到MAC地址动态主机配置协议DHCP网际控制报文协议ICMPIPV6内部网关协议&#xff08;IGP&#xff09;外部网关协议(EGP) 功能 异构…

数字人直播系统——打破时空限制的新媒体时代

随着科技的不断进步&#xff0c;新媒体开始逐渐成为人们获取信息和娱乐的首选方式。其中&#xff0c;数字人直播系统作为一种创新的传媒形式&#xff0c;正以其独特的优势受到越来越多人的关注和喜爱。数字人直播系统通过将虚拟人物与现实世界紧密结合&#xff0c;打破了时间和…