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 位) |
实例成员与静态成员
类中的成员大致可分为如下四种:
- 实例成员属性
- 实例成员函数
- 静态成员属性
- 静态成员函数
实例成员
实例成员即类的实例中的成员。实例成员从类中得来,最终归属于由类创建的实例对象。每一个实例对象中都含有类中的非静态成员的副本。
静态成员
静态成员归属于类,由类的所有实例对象所共享。
如果将一个成员属性声明为静态成员属性,则该类的所有对象都可以访问该成员属性。如果将一个成员函数声明为静态成员函数,那么该函数将能够在类的任何实例被创建前调用。
上述内容整理自 静态 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
请按任意键继续. . .
注:
- 与静态成员属性不同,静态成员函数可以在类中声明在类外定义,也可以直接在类中完成所有操作。
- 静态成员函数常用于处理静态成员属性。
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 (第九版)托尼加迪斯、朱迪沃尔特斯、戈德弗雷穆甘达 (著) / 黄刚 等 &…...
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溯源到这篇文章,ClassMix主要是集合了伪标签和一致性正则化,思想来源于CutMix那条研究路线,但是优化了CutMix中的标签污染的情…...
CSDN竞赛第35期题解
CSDN竞赛第35期题解 1、题目名称:交换后的or 给定两组长度为n的二进制串,请问有多少种方法在第一个串中交换两个不同位置上的数字,使得这两个二进制串“或”的 结果发生改变? int n;cin>>n; string a,b;cin>>a>…...
Java应用服务系统安全性,签名和验签浅析
1 前言 随着互联网的普及,分布式服务部署越来越流行,服务之间通信的安全性也是越来越值得关注。这里,笔者把应用与服务之间通信时,进行的的安全性相关,加签与验签,进行了一个简单的记录。 2 安全性痛点 …...
spring中bean的实例化
构造方法实现实例化 无参构造器实例化 我们之前用的就一直是无参构造器实现实例化,虽然没有在类中写构造器,但是每个类都会有一个默认的无参构造器 有参构造器实例化 相比于无参构造器,我们只需要传入参数就可以了 我们可以通过construc…...
磨皮插件portraiture2023最新中文版
Portraiture滤镜是一款 Photoshop,Lightroom 和 Aperture 插件,DobeLighttroom 的 Portraiture 消除了选择性掩蔽和逐像素处理的繁琐的手工劳动,以帮助您在肖像修整方面取得卓越的效果。它是一个强大的,但用户友好的插件照明.这是…...
记录每日LeetCode 2269.找到一个数组的K美丽值 Java实现
题目描述: 一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目: 子字符串长度为 k 。 子字符串能整除 num 。 给你整数 num 和 k ,请你返回 num 的 k 美丽值。 注意: 允许有 前缀 0 。 0 不能整除任何…...
代码管理--svnadmin工具介绍
1、简介 SVNAdmin2 是一款通过图形界面管理服务端SVN的web程序。正常情况下配置SVN仓库的人员权限需要登录到服务器手动修改 authz 和 passwd 两个文件,当仓库结构和人员权限上了规模后,手动管理就变的非常容易出错,本系统能够识别人员和权限…...
Git的基本使用以及上传到GitHub
GIT的基本使用一、安装并配置GIT二、Git的基本操作三、使用GIT上传至GitHub四、Git分支一、安装并配置GIT 1.安装GIT连接 GIT安装包链接 2.打开GIT 鼠标右键点击Git Bash Here 安装完 Git 之后,第一件事就是设置自己的用户名和邮件地址。因为通过 Git 对项目进行…...
国科大论文latex模板中可能的注意事项
背景 国科大2022年9月发布了毕业论文的LaTeX模板,它是在ucasthesis上修改而来的,但近日使用国科大发布版本时发现有几点不同以及需要注意的地方。本人只会简单使用latex,但并不熟悉latex样式编辑,因此以下介绍与方法仅供参考。仅…...
ABAP 怎样将XML和JSON格式转换为HTML格式显示
ABAP 怎样将XML和JSON格式转换为HTML格式显示 一、将JSON格式转换为HTML格式 BAP接口程序开发中时常会用到JSON格式来传输数据,在监控传输的JSON串内容时,把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 ,这些接口是为了支持浏览器或者一些其他实现了实时交换协议的设备进行媒体信息和程序数据交换。 1、实现点对点通信的规范: NAT穿透实现与远端节点链接比如&a…...
数据结构与算法基础(王卓)(16):KMP算法详解(代码实现)
实现代码的过程中 具体细节、问题: (1):关于写Get_next函数的标题: 现象: PPT上写的是: void get_next(SString T, int &next[]) 然而并不能运行,而当我们去掉了引用符号&…...
九龙证券|盘前直接腰斩,银行巨头紧急“拔网线”!美股银行股又崩了?
见证历史了,又有一家银行巨子倒下? 美股银行股团体暴降 上一交易日暴降超60%的硅谷银行持续面对腥风血雨。盘前,硅谷银行跌幅超50%,随后,公司宣布盘前暂停交易,等待刊发消息。 而最新消息显现,…...
接口优化常用思路
空间换时间 计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招–以空间换时间 合理使用缓存就是一个很好的例子,针对一些频繁使用且不频繁变更的数据&#…...
【SpringCloud】SpringCloud面试题整理
文章目录1、什么是Spring Cloud?2、Spring Cloud和Dubbo的区别3、REST和RPC的区别4、SpringCloud如何实现服务的注册和发现5、什么是服务熔断和服务降级?6、项目中zuul常用的功能7、服务网关的作用8、ribbon和feign区别9、ribbon的负载均衡策略10、简述什…...
一些数据库知识点总结
DB2数据库:从数据库表中第I条记录开始检索J条记录SELECT * FROM (SELECT A.*, ROW_NUMBER() OVER() AS NFROM (SELECT * FROM table_name) AS A)WHERE N > I AND N < J;Oracle数据库:从数据库表中第M条记录开始检索N条记录SELECT * FROM (SELECT R…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
