当前位置: 首页 > news >正文

C++ this 指针与静态成员

文章目录

  • 参考
  • 描述
  • 实例成员与静态成员
      • 实例成员
      • 静态成员
  • 静态成员属性
  • 隐式形参 this 指针
      • 冲突
      • this 指针
  • 静态成员函数
      • this 指针与静态成员函数

参考

项目
精通C++ (第九版)托尼·加迪斯、朱迪·沃尔特斯、戈德弗雷·穆甘达 (著) / 黄刚 等 (译)
搜索引擎Bing

描述

项目描述
编译器gcc version 8.1.0 (x86_64-win32-seh-rev0, Built by MinGW-W64 project)
操作系统Windows 10 专业版(64 位)

实例成员与静态成员

类中的成员大致可分为如下四种:

  1. 实例成员属性
  2. 实例成员函数
  3. 静态成员属性
  4. 静态成员函数

实例成员

实例成员即类的实例中的成员。实例成员从类中得来,最终归属于由类创建的实例对象。每一个实例对象中都含有类中的非静态成员的副本。

静态成员

静态成员归属于类,由类的所有实例对象所共享。

如果将一个成员属性声明为静态成员属性,则该类的所有对象都可以访问该成员属性。如果将一个成员函数声明为静态成员函数,那么该函数将能够在类的任何实例被创建前调用。


上述内容整理自 静态 C++(第九版)

静态成员属性

在声明成员属性时,使用 static 关键字将能够将该成员属性声明为静态成员属性。对此,请参考如下示例:

#include <iostream>
#include <string>
using namespace std;class Notebook 
{public:// 声明静态成员属性 contentstatic string content;
};// 定义静态成员属性
string Notebook::content = "Hello World";int main(){// 实例化Notebook notebook_1;Notebook notebook_2;cout << notebook_1.content << endl;// 通过 notebook_2 对象修改静态成员属性notebook_2.content = "TwoMoons";// 再次通过 notebook_1 对 content 进行访问cout << notebook_1.content << endl;system("pause");
}

执行效果

Hello World
TwoMoons
请按任意键继续. . .

注:

静态成员属性 必须在类中声明,在类外定义。若在类中进行声明并对其初始化,那么 C++ 将因此抛出错误。

隐式形参 this 指针

默认情况下,编译器为类的每个成员函数提供了一个隐式形参,该形参指向被调用的成员函数所在的对象。该隐式形参称为 this


上述内容引用自 精通 C++ (第九版)

隐式形参 this 为一个指针,指向函数所在的对象。你可以在成员函数中直接使用隐式形参 this 。实际上,当你在成员函数中直接访问类中的成员时,就已经隐式地使用了 this 指针。

举个栗子

#include <iostream>
#include <string>
using namespace std;class Notebook 
{public: string content = "Hello World";void echo(){// 输出所属类的地址(以十进制展示)cout << (long long)this << endl;// 输出所属类的 content 成员属性cout << this -> content << endl;};
};int main(){// 实例化Notebook notebook;notebook.echo();system("pause");
}

执行效果

6422000
Hello World
请按任意键继续. . .

注:

this 指针仅能指向由所属类实例化的对象,将实参赋予形参的操作将在创建类的实例对象的过程中自动完成。

冲突

当成员函数的形参与成员属性同名时,在成员函数的内部将发生冲突,成员属性将被隐藏。对此,请参考如下示例:

#include <iostream>
#include <string>
using namespace std;class Notebook
{public:string content = "TwoMoons";void read(string content){// 输出 content cout << content << endl;};
};int main(){Notebook notebook;notebook.read("RedHEart");system("pause");
}

执行结果

RedHEart
请按任意键继续. . .

在成员函数中向控制台输出 content 中保存的数据,结果是将 形参 content 中的内容进行输出,而 成员属性 content 被忽略。

this 指针

通过 this 指针,我们可以在发生冲突的成员函数内部冲破同名形参的封锁,访问同名的成员属性。对此,请参考如下示例:

#include <iostream>
#include <string>
using namespace std;class Notebook
{public:string content = "TwoMoons";void read(string content){// 输出 content cout << content << endl;// 输出成员属性 content cout << this -> content << endl;};
};int main(){Notebook notebook;notebook.read("RedHEart");system("pause");
}

执行结果

RedHEart
TwoMoons
请按任意键继续. . .

静态成员函数

通过在函数头前添加 static 关键字即可将该函数声明为所属类的静态成员函数。静态成员函数可在任何实例对象被创建前调用。对此,请参考如下示例:

#include <iostream>
#include <string>
using namespace std;class Notebook
{
public:// 声明静态成员属性static string content;// 声明静态成员函数static void read(){// 访问静态成员属性cout << content << endl;}
};
// 初始化静态成员属性
string Notebook::content = "Hello World";int main()
{// 在类的任何示例创建前调// 用静态成员函数Notebook::read();// 实例化 NotebookNotebook notebook;// 你也可以通过实例化对象对// 静态成员函数进行调用。notebook.read();system("pause");
}

执行效果

Hello World
Hello World
请按任意键继续. . .

注:

  1. 与静态成员属性不同,静态成员函数可以在类中声明在类外定义,也可以直接在类中完成所有操作。
  2. 静态成员函数常用于处理静态成员属性。

this 指针与静态成员函数

由于静态成员函数属于类而非类的实例,因此静态成员函数不具有隐式形参。这也导致了静态成员函数无法直接访问类中的非静态成员。

举个栗子

#include <iostream>
#include <string>
using namespace std;class Notebook
{public:string content = "Red HEart";static void read(){// 如下两条语句将导致 C++ 抛出错误// cout << content << endl;// cout << this << endl;}
};int main(){Notebook::read();system("pause");
}

相关文章:

C++ this 指针与静态成员

文章目录参考描述实例成员与静态成员实例成员静态成员静态成员属性隐式形参 this 指针冲突this 指针静态成员函数this 指针与静态成员函数参考 项目精通C &#xff08;第九版&#xff09;托尼加迪斯、朱迪沃尔特斯、戈德弗雷穆甘达 &#xff08;著&#xff09; / 黄刚 等 &…...

REDIS16_LRU算法概述、查看默认内存、默认是如何删除数据、缓存淘汰策略

文章目录①. LRU算法概述②. 查看默认内存③. 如何删除数据④. 缓存淘汰策略①. LRU算法概述 ①. LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的数据给予淘汰 (leetcode-cn.com/problems/lru-cache) ②. LRU算法题来源 ③.…...

ClassMix: Segmentation-Based Data Augmentation for Semi-Supervised Learning学习笔记

ClassMix相关介绍主要思想方法Mean-Teacher损失函数交叉熵损失标签污染实验实验反思参考资料相关介绍 从DAFormer溯源到这篇文章&#xff0c;ClassMix主要是集合了伪标签和一致性正则化&#xff0c;思想来源于CutMix那条研究路线&#xff0c;但是优化了CutMix中的标签污染的情…...

CSDN竞赛第35期题解

CSDN竞赛第35期题解 1、题目名称&#xff1a;交换后的or 给定两组长度为n的二进制串&#xff0c;请问有多少种方法在第一个串中交换两个不同位置上的数字&#xff0c;使得这两个二进制串“或”的 结果发生改变&#xff1f; int n;cin>>n; string a,b;cin>>a>…...

Java应用服务系统安全性,签名和验签浅析

1 前言 随着互联网的普及&#xff0c;分布式服务部署越来越流行&#xff0c;服务之间通信的安全性也是越来越值得关注。这里&#xff0c;笔者把应用与服务之间通信时&#xff0c;进行的的安全性相关&#xff0c;加签与验签&#xff0c;进行了一个简单的记录。 2 安全性痛点 …...

spring中bean的实例化

构造方法实现实例化 无参构造器实例化 我们之前用的就一直是无参构造器实现实例化&#xff0c;虽然没有在类中写构造器&#xff0c;但是每个类都会有一个默认的无参构造器 有参构造器实例化 相比于无参构造器&#xff0c;我们只需要传入参数就可以了 我们可以通过construc…...

磨皮插件portraiture2023最新中文版

Portraiture滤镜是一款 Photoshop&#xff0c;Lightroom 和 Aperture 插件&#xff0c;DobeLighttroom 的 Portraiture 消除了选择性掩蔽和逐像素处理的繁琐的手工劳动&#xff0c;以帮助您在肖像修整方面取得卓越的效果。它是一个强大的&#xff0c;但用户友好的插件照明.这是…...

记录每日LeetCode 2269.找到一个数组的K美丽值 Java实现

题目描述&#xff1a; 一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目&#xff1a; 子字符串长度为 k 。 子字符串能整除 num 。 给你整数 num 和 k &#xff0c;请你返回 num 的 k 美丽值。 注意&#xff1a; 允许有 前缀 0 。 0 不能整除任何…...

代码管理--svnadmin工具介绍

1、简介 SVNAdmin2 是一款通过图形界面管理服务端SVN的web程序。正常情况下配置SVN仓库的人员权限需要登录到服务器手动修改 authz 和 passwd 两个文件&#xff0c;当仓库结构和人员权限上了规模后&#xff0c;手动管理就变的非常容易出错&#xff0c;本系统能够识别人员和权限…...

Git的基本使用以及上传到GitHub

GIT的基本使用一、安装并配置GIT二、Git的基本操作三、使用GIT上传至GitHub四、Git分支一、安装并配置GIT 1.安装GIT连接 GIT安装包链接 2.打开GIT 鼠标右键点击Git Bash Here 安装完 Git 之后&#xff0c;第一件事就是设置自己的用户名和邮件地址。因为通过 Git 对项目进行…...

国科大论文latex模板中可能的注意事项

背景 国科大2022年9月发布了毕业论文的LaTeX模板&#xff0c;它是在ucasthesis上修改而来的&#xff0c;但近日使用国科大发布版本时发现有几点不同以及需要注意的地方。本人只会简单使用latex&#xff0c;但并不熟悉latex样式编辑&#xff0c;因此以下介绍与方法仅供参考。仅…...

ABAP 怎样将XML和JSON格式转换为HTML格式显示

ABAP 怎样将XML和JSON格式转换为HTML格式显示 一、将JSON格式转换为HTML格式 BAP接口程序开发中时常会用到JSON格式来传输数据&#xff0c;在监控传输的JSON串内容时&#xff0c;把JSON转换为HTML格式来显示会很便利。下面提供一个简单例子来实现JSON转化为HTML并显示的功能。…...

基础课DP

DP 背包问题01背包问题完全背包问题多重背包问题多重背包问题II分组背包问题线性DP数字三角形最长上升子序列最长上升子序列II最长公共子序列编组距离区间DP石子合并计数类DP整数划分数位统计DP计数问题状态压缩DP蒙德里安的梦想最短Ha路径树形DP没有上司的舞会...

基于支持向量机SVM的风电场NWP数据预测,SVM的详细原理

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的风电场NWP预测 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定…...

webRtc概念

webRtc概念 以下的文档整理来自此链接 文档整理了一系列实现web通用接口的ECMAScript APIs &#xff0c;这些接口是为了支持浏览器或者一些其他实现了实时交换协议的设备进行媒体信息和程序数据交换。 1、实现点对点通信的规范&#xff1a; NAT穿透实现与远端节点链接比如&a…...

数据结构与算法基础(王卓)(16):KMP算法详解(代码实现)

实现代码的过程中 具体细节、问题&#xff1a; &#xff08;1&#xff09;&#xff1a;关于写Get_next函数的标题&#xff1a; 现象&#xff1a; PPT上写的是&#xff1a; void get_next(SString T, int &next[]) 然而并不能运行&#xff0c;而当我们去掉了引用符号&…...

九龙证券|盘前直接腰斩,银行巨头紧急“拔网线”!美股银行股又崩了?

见证历史了&#xff0c;又有一家银行巨子倒下&#xff1f; 美股银行股团体暴降 上一交易日暴降超60%的硅谷银行持续面对腥风血雨。盘前&#xff0c;硅谷银行跌幅超50%&#xff0c;随后&#xff0c;公司宣布盘前暂停交易&#xff0c;等待刊发消息。 而最新消息显现&#xff0c…...

接口优化常用思路

空间换时间 计算机程序中最大的矛盾是空间和时间的矛盾&#xff0c;那么&#xff0c;从这个角度出发逆向思维来考虑程序的效率问题&#xff0c;我们就有了解决问题的第1招–以空间换时间 合理使用缓存就是一个很好的例子&#xff0c;针对一些频繁使用且不频繁变更的数据&#…...

【SpringCloud】SpringCloud面试题整理

文章目录1、什么是Spring Cloud&#xff1f;2、Spring Cloud和Dubbo的区别3、REST和RPC的区别4、SpringCloud如何实现服务的注册和发现5、什么是服务熔断和服务降级&#xff1f;6、项目中zuul常用的功能7、服务网关的作用8、ribbon和feign区别9、ribbon的负载均衡策略10、简述什…...

一些数据库知识点总结

DB2数据库&#xff1a;从数据库表中第I条记录开始检索J条记录SELECT * FROM (SELECT A.*, ROW_NUMBER() OVER() AS NFROM (SELECT * FROM table_name) AS A)WHERE N > I AND N < J;Oracle数据库&#xff1a;从数据库表中第M条记录开始检索N条记录SELECT * FROM (SELECT R…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...