static 成员函数

        在书上看到这样一段话 ”在引入static 成员函数之前,C++语言要求所有的成员函数都必须经由该 class 的对象来调用。而实际上,只有当一个或多个 nonstatic 数据成员在成员函数中被直接存取时,才需要 class 的对象。class 对象提供了 this 指针来给这种形式的函数调用。这个 this 指针把 ‘在成员函数中存取的nonstatic 数据成员’ 绑定于 ‘对象内的对应的成员之上’,如果没有一个任何一个成员被存取,事实上就不需要这个 this 指针,因此也没有必要通过一个 class 对象来调用一个成员函数“。用例子来表达如下:
 

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

class origin
{
public:
	int getX();
	static int x;
};

int origin::x = 100;
int origin::getX()
{
	return origin::x;
}

int main()
{
	printf("origin::x = %d\n", ((origin*)0)->getX());
	
	return 0;
}

如果调用成员函数一定要用 class 的对象的话,解决之道就是很奇怪地把 0 强制转型为一个 class 指针,因而提供出一个 this 指针实体。这是在没有引入  static 成员函数之前的实现方法,到现在的编译器也还支持这种方法,编译没有错误,执行也正常:

这里我们可能会更好奇为什么是把 0 强制转换成类对象呢?其实这里关键点是实例出一个 this 指针实体,并不关心是 0 或是其他,如我把 0 改成 100:

int main()
{
	printf("(origin*100)origin::x = %d\n", ((origin*)100)->getX());
	
	return 0;
}

我想这个应该是语言特性上支持的。但并不是所有的转换都能成功,最起码要遵循C++语言规则,如两个不相关的类进行强转:

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

class origin
{
public:
	int getX();
	static int x;
};

int origin::x = 100;
int origin::getX()
{
	return origin::x;
}

class derived
{
	
};

int main()
{
	derived A;
	printf("(origin* A)origin::x = %d\n", ((origin*)A)->getX());
	
	return 0;
}

 

两个不相关的类进行转换,必定是失败的。但如果是这样呢: 

printf("(origin* A)origin::x = %d\n", ((origin*)&A)->getX()); 那应该是成功的,因为此时转换的就是一个地址而已,跟转换 0 性质是一样的。

这种是程序方法上的解决之道,而语言层面上的解决之道就是引入了 static 成员函数,它的主要特性就是没有 this 指针。以下的次要特性统统根源于它的主要特性:

1,不能直接存取 class 中的 nonstatic 成员

2,不能够被声明为 const, volatile, virtual

3, 不需要经由 class 对象来调用 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#版字节跳动SDK - SKIT.FlurlHttpClient.ByteDance

前言 在我们日常开发工作中对接第三方开放平台&#xff0c;找一款封装完善且全面的SDK能够大大的简化我们的开发难度和提高工作效率。今天给大家推荐一款C#开源、功能完善的字节跳动SDK&#xff1a;SKIT.FlurlHttpClient.ByteDance。 项目官方介绍 可能是全网唯一的 C# 版字…

C语言简介

Visual Studio编辑器左侧菜单栏不小心关掉如何打开&#xff08;左侧解决方案资源管理器不显示如何打开&#xff09;、C语言中int main和void main的区别以及C工程的创建_visual studio2022 资源管理器怎么打开桌面面板-CSDN博客 目录 ​编辑 1. 简介 2. 介绍 3. C程序 …

保姆式挑选钢化膜教程,不看真的后悔

覆盖率 我们怎样挑选钢化膜呢&#xff1f;选手机膜最重要的是看它的覆盖率&#xff0c;所谓覆盖就是手机膜覆盖住你的手机屏幕&#xff0c;一般覆盖率达到 97% 左右&#xff0c;几乎就感受不到膜的存在。 很多朋友应该听说过 2D 钢化膜&#xff0c;它是没有经过边缘抛光处理的…

Django部署到服务器后无法获取到静态元素 The requested resource was not found on this server

问题描述 写了一个Django项目&#xff0c;部署到云主机后&#xff0c;访问发现图片无法访问&#xff0c;报错The requested resource was not found on this server 图片是一个词云图&#xff0c;根据爬虫爬取的信息生成的&#xff0c;根据爬取的信息会改变&#xff0c;所以没…

负责任的老师都具备哪些特点

选择成为一名教师时&#xff0c;就承诺要为学生提供最好的教育。但是&#xff0c;什么是最好的教育呢&#xff1f;我认为&#xff0c;一个负责任的老师应该具备以下几个特点&#xff1a; 了解学生 作为老师&#xff0c;我们首先要了解自己的学生。每个学生都是独特的个体&…

研究近期的伦敦银走势图 有什么特别要注意的?

对伦敦银走势图进行分析&#xff0c;这是我们入场交易之前要做的必要准备。没有对伦敦银走势图的充分分析和了解&#xff0c;投资者不应该入场。下面我们就来讨论一下&#xff0c;要对近期的伦敦银走势图进行分析&#xff0c;我们要注意什么。 研究美联储的动向。从上周开始&am…

UE4 C++ UGameInstance实例化

1.创建GameInstance C类 2.在.h添加变量 class 工程名称_API UMyGameInstance : public UGameInstance {GENERATED_BODY()public: //定义了三个公开的变量UMyGameInstance();UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "MyGameInstance")FString Name…

回归预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机多变量回归预测

回归预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机多变量回归预测 目录 回归预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向…

HarmonyOS4.0系统性深入开发33相对布局(RelativeContainer)

相对布局&#xff08;RelativeContainer&#xff09; 概述 RelativeContainer为采用相对布局的容器&#xff0c;支持容器内部的子元素设置相对位置关系。子元素支持指定兄弟元素作为锚点&#xff0c;也支持指定父容器作为锚点&#xff0c;基于锚点做相对位置布局。下图是一个…

python数据类型-列表

1 python中列表的定义 python中列表是一种有序和可更改的集合&#xff0c;允许重复的成员&#xff0c;列表中的元素之间数据类型可以不同&#xff08;元素之间数据类型可以不相同&#xff0c;这一点和其它的面向对象的开发语言有很大的不同&#xff0c;如C#、Java&#xff09;…

如何本地搭建Emby影音管理服务并结合内网穿透实现远程访问本地影音库

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…

【Midjourney】新手指南:命令

1./ask 向Midjourney提问&#xff0c;不过问题和回答都是英文的&#xff0c;例如&#xff1a; 2./blend 将两张图片合并为一张 ​ 3./describe 上传一张图片&#xff0c;Midjourney会生成四组该图片相关的关键词&#xff0c;可以使用这些关键词再生成图片。 ​ 4./turbo …

qt 控件比较大,图像比较小时,如何居中贴图

直接用样式表修改 QPushButton#close_btn { background:transparent; background-image: url(://res/image/close_white.png); background-repeat: no-repeat; background-position: center;}

Linux系统安全之iptables防火墙

目录 一、iptables防火墙的基本介绍 1、netfile与iptables的关系 1.1netfile 1.2iptables 1.3iptables是基于内核的防火墙&#xff0c;其中内置了raw&#xff0c;mangle&#xff0c;nat和filter四个规则表 2、iptables防火墙默认规则表&#xff0c;链结构 二、iptables的…

Go之流程控制大全: 细节、示例与最佳实践

本文深入探讨Go语言中的流程控制语法&#xff0c;包括基本的if-else条件分支、for循环、switch-case多条件分支&#xff0c;以及与特定数据类型相关的流程控制&#xff0c;如for-range循环和type-switch。文章还详细描述了goto、fallthrough等跳转语句的使用方法&#xff0c;通…

gradio进度条实现不成功,使用components替代

实现了一个功能&#xff0c;上传一个图像后自动调用函数做算法处理&#xff0c;但是网页如果静止&#xff0c;等待的这段时间会令人怀疑&#xff0c;是不是真的在处理&#xff0c;处理的时长是多少&#xff1f; 首先查了下进度条的实现&#xff0c;有个Progress的函数&#xf…

什么是高级持续性威胁(APT)

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

【Unity3D小功能】Unity3D中Text使用超链接并绑定点击事件

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中遇到了要给Text加超链接的需求&#xff0c;研究了实现…

C++开发基础之预编译头文件 stdafx.h的作用

引言 在 C 开发中&#xff0c;为了提高编译效率和减少重复编译的时间&#xff0c;我们可以使用 stdafx.h 这个预编译头文件。本文将介绍 stdafx.h 是什么&#xff0c;以及它在 C 项目中的作用。 1、什么是 stdafx.h&#xff1f; stdafx.h 是一个预编译头文件&#xff0c;在 …

Synchronized作用

synchronized能够在同一时刻最多只有一个线程执行该代码 证明如下&#xff1a; public class MyThread {public static void main(String[] args) throws InterruptedException {Ticket ticket new Ticket();Thread aa new Thread(() -> {try {ticket.getCount();} catc…