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…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...