this指针详细总结 | static关键字 | 静态成员

文章目录

        • 1.this指针引入
        • 2.this指针的特性
        • 3.静态成员
          • 3.1.C语言中static的基本用法
          • 3.2.C++中的static关键字

1.this指针引入
class student
{
public:student(const string& name){	_name = name;	}void print(){// _name<=>this->_name<=>(*this)._name// 说一下:指针用箭头->返回成员(如:结构体,this->_name); 对像用.来访问成员cout << "我是" << _name << endl; }
private:string _name;
};
int main()
{student stu1("张三");	stu1.print();student	stu2("李四");	stu2.print();return 0;
}

结果输出:

我是张三
我是李四

C++编译器为每个"非静态的成员函数",增加了一个隐藏的this指针,然该指针指向当前对象(函数运行时调用该函数的对象),来完成对"成员变量"的操作! 输出张三,说明访问stu1对象中村存储的数据"张三";数据李四,方式的是stu2对象域中的数据,根据this指针代表的对象不同,访问到的数据就会不同。

2.this指针的特性

this指针本质上是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参; this在成员函数开始执行前构造,在执行结束后销毁。那this指针存放在哪里?

class number
{
public:void sum(int x, int y){_result = x + y;}
private:int _result = 0;
};int main()
{number num;num.sum(1, 2);return 0;
}

在32位机器上,通过上面的代码对num.sum(1, 2);反汇编:

	num.sum(1, 2);
00671907  push        2  
00671909  push        1  
0067190B  lea         ecx,[num]  
0067190E  call        number::sum (06712F3h) 

可以看的,在call调用sum成员函数之前编译器ecx计数寄存器自动传递this指针;一般来说this指针是在栈上的,VS将对象的num的地址存放到ecx中!this指针存放到ecx中;不同的编译器可能会有不同。

this指针是:类的类型 * const 所以在成员函数中不能对this指针做修改

class number
{
public:void sum(int x, int y){this = nullptr;	// 不允许,也不允许&this(想要查看this的地址)_result = x + y;}
private:int _result = 0;
};

另外,this指针是编译器自动的传递,而且会占用参数的第一个位置,我们不用显示的传递,也不能在成员函数中显示的接收,但是在成员函数中显示的使用 如:this->_result

class number
{
public:void sum(number const& this,int x, int y){_result = x + y;}
private:int _result = 0;
};

当然我们可以使用this来区分两种定义对象的不同方式:

class student
{
public:student(const string& name) {_name = name;}void print() {int num = 1;char* ptr = (char*)malloc(1);printf("num的地址:%p,malloc的地址:%p,this指向对象的地址:%p\n", &num,ptr,this);cout << "我是" << _name << endl;}
private:string _name;
};
int main()
{student stu1("张三");	stu1.print();student* stu2 = new student("李四");stu2->print();return 0;
}

输出结果:

num的地址:009DF63C,malloc的地址:00E4F618,this指向对象的地址:009DF7B8
我是张三
num的地址:009DF63C,malloc的地址:00E4B3C8,this指向对象的地址:00E4E178
我是李四

为什么要做上面的这个实验,我之前老想不明白,害,太菜了!其实new的底层是malloc,是在堆上开辟空间!

this指针存放在哪里,this指针可以为空吗

class A
{
public:void Print(){cout << "Print()" << endl;}
private:int _a;
};
int main()
{A* p = nullptr;p->Print();return 0;
}
// 上面的正常运行class A
{
public:void PrintA(){cout << _a << endl; //显示写:this->_a,this指针为nullptr,解引用,程序崩溃}
private:int _a;
};
int main()
{A* p = nullptr;p->PrintA();return 0;
}

上面两段代码,在main函数中,都没有问题,p对象访问成员函数,因为Print成员函数的地址不在对象中,不会发生解引用!

3.静态成员
3.1.C语言中static的基本用法

在C语言中,static修饰的局部的变量可以,可以改变其是生命周期,使其生命周期随程序;对静态的全部变量和函数,限制在本源文件内使用;也就是说如果static修饰全局的变量或函数,跨一个源文件就不能使用!

下图是没有修饰的,可以跨源文件使用:

在这里插入图片描述

3.2.C++中的static关键字

C++中声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰成员函数,称之为静态成员函数静态成员变量一定要在类外进行初始化,类中的只是声明

#include<iostream>
using namespace std;void sum(int x, int y) {}
int g_val = 5;class Math
{
public:const static int _num = 0; // 这样在类内定义静态成员变量也是可以的,不推荐static void sum(int x, int y) {}
private:static int _result; // 这里只是声明!};
int Math::_result = 5; // 定义并初始化!int main()
{printf("全局的变量:%p, Math类中的静态函数:%p\n", sum, Math::sum);printf("全局的变量:%p, Math类中的静态变量:%p\n", &g_val, &Math::_num);return 0;
}

输出结果:

全局的变量:003A12B7, number类中的静态函数:003A1073
全局的变量:003AA000, number类中的静态变量:003AA1A8

静态成员变量:会被类的所有对象共享,包括派生类的对象;static修饰变量(全局,局部,成员)和全局变量一样放在全局的数据区在来编译器编译的时候就会开辟空间并完成初始化!(有资料说,静态成员变量因为构造函数的问题,在使用到相关代码才会初始化,但是我通过调试是在加载的时候就初始化的,害!)

静态成员函数:静态成员函数没有隐藏的this指针,不能访问任何非静态成员;但是非静态函数却能任何静态成员;

类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问,当然. 静态成员也是类的成员,受public、protected、private 访问限定符的限制!

实现一个类,计算程序中创建出了多少个类对象

class A
{
public:A() { ++_scount; }A(const A& t) { ++_scount; }~A() { --_scount; }static int GetACount() { return _scount; }
private:static int _scount;
};
int A::_scount = 0;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv5算法进阶改进(15)— 引入密集连接卷积网络DenseNet

前言:Hello大家好,我是小哥谈。DenseNet(密集连接卷积网络)是一种深度学习神经网络架构,它在2017年由Gao Huang等人提出。DenseNet的核心思想是通过密集连接(dense connection)来促进信息的流动和共享。在传统的卷积神经网络中,每个层的输入只来自于前一层的输出。而在…

Python爬虫从基础到入门:数据接口实战--获取豆瓣阅读热度最高的书籍信息

接着上一篇文章&#xff1a;Python爬虫从基础到入门&#xff1a;找数据接口&#xff0c;接下来实战一下&#xff0c;以获取豆瓣阅读这个网站热度最高的书籍信息为例&#xff0c;网址为&#xff1a;豆瓣阅读 Python爬虫从基础到入门&#xff1a;数据接口实战--获取豆瓣阅读热度…

Java自救手册

目录 访问地址 访问地址&#xff0c;发现不通&#xff0c;无法访问&#xff1a; 网络不通一般有两种情况&#xff1a; Maven 拿Maven 拿到Maven以后 Maven单独的报红 Git git注意&#xff1a; 目录 访问地址 访问地址&#xff0c;发现不通&#xff0c;无法访问&…

(南京观海微电子)——TFT闪屏分析

LCD显示屏闪屏的原因&#xff1a;屏蔽线圈&#xff1b; 信号干扰&#xff1b; 硬件; 刷新频率设置&#xff1b; 监控时间过长&#xff1b; 频率太高&#xff1b; 类似于光源的频率。 一、TFT液晶屏本身的频率太高导致闪屏 TFT液晶屏本身的频率太高导致了闪屏&#xff0c;不过…

MySQL-事务(TRANSACTION)

文章目录 1. 事务概述2. 事务的四大特性&#xff08;ACID&#xff09;3. 控制事务4. 并发事务产生的问题5. 事务的隔离级别6. 拓展6.1 InnoDB如何解决幻读&#xff1f;6.2 MySQL实现事务的原理&#xff1f; 1. 事务概述 定义&#xff1a;数据库的事务&#xff08; Transaction…

小华和小为的聚餐地点 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 小华和小为是很要好的朋友&#xff0c;他们约定周末一起吃饭。 通过手机交流&#xff0c;他们在地图上选择了多个聚餐地点(由于自然地形等原因&#xff0c;部分聚…

1 月 30 日算法练习-数论

唯一分解定理 唯一分解定理指的是&#xff1a;对于任意一个>1的正整数&#xff0c;都可以以唯一的一种方式分解为若干质因数的乘积。 x p 1 k 1 ⋅ p 2 k 2 ⋅ … ⋅ p m k m x p_1^{k_1} \cdot p_2^{k_2} \cdot \ldots \cdot p_m^{k_m} xp1k1​​⋅p2k2​​⋅…⋅pmkm​…

成都爱尔林江院长解读儿童青少年为什么一定要进行医学验光配镜

根据国家卫健委数据显示&#xff1a;我国青少年儿童总体近视率为52.7%、高度近视人口超3000万。近视学生中,有10%为高度近视,且占比随年级升高而增长。 近视孩子之多&#xff0c;孩子视力发展备受关注。戴镜进行近视防控十分必要&#xff0c;且眼镜不可随意验配&#xff01; 成…

B.关鸡-牛客寒假训练营(一)

https://ac.nowcoder.com/acm/contest/67741/B 本题使用set<pair<int,int>>st来存放数据可以做到高效查找 考虑以下两种情况 情况一、火鸡左右分别被包围最多4堆火 或者上下两堆火间距不超过1 情况二、火鸡左右下被包住,最多3堆火 还有一种特殊情况,一侧被包…

PyTorch——初识PyTorch框架

本文主要介绍PyTorch的基础知识&#xff0c;PyTorch的优点&#xff0c;案例&#xff0c;PyTorch和Tensorflow的对比&#xff0c;让我们对PyTorch的框架有一个基本的了解。 1.1 为什么要选择学习PyTorch&#xff08;PyTorch的优点&#xff09;&#xff1f; 活跃度&#xff1a;逐…

APK签名 v1、 v2、v3、v3.1、v4 解析

在 Android 应用签名中&#xff0c;V1 V2 V3 V4签名是不同的签名方案&#xff0c;具体描述如下&#xff1a; V1 签名&#xff08;JAR 签名&#xff09;&#xff1a;早期 Android 应用签名的基本形式&#xff0c;基于 Java 签名&#xff08;JAR 签名&#xff09;规范。它将应用…

simulink产生PWM波-PWM Generator模块使用

一、什么是PWM 脉冲宽度调制&#xff08;PWM&#xff09;&#xff0c;简称脉宽调制&#xff0c;系指借助微处理器数字输出对模拟电路实施控制的一种高效方法&#xff0c;其在从测量、通信至功率控制与转换等多个领域具有广泛应用。 二、PWM的参数 PWM的频率与周期 PWM的频率…