C++:从结构体开始理解this指针

2023-05-16

C++:从结构体开始理解this指针

#include <iostream>
#include <string>

using namespace std;
class student
{
public :
	void Init(string id,string name,int age)
	{
		id_ = id;
		name_ = name;
		age_ = age;
	}
	void print()
	{
		cout << id_ << endl;
		cout << name_ << endl;
		cout << age_ << endl;
	}
public:
	string id_;
	string name_;
	int age_;
};

int main()
{
	student s1, s2;
	s1.Init("001", "张三", 18);
	s1.print();
	s1.Init("002", "李四", 18);
	s1.print();
	s2.Init("001", "王五", 18);
	s2.print();
	s2.Init("002", "丽萨", 18);
	s2.print();
	system("pause");
	return 0;
}

对于上面的student类中有Init与print两个成员函数,函数体中没有关于不同对象的区分,那当s1调用Init函数时,该函数是如何知道应该设置s1对象,而不是设置s2对象呢?
我们知道在C++中结构体和类的区别并不是很大,所以我们可以先看看在C语言的结构体中是怎么解决这个问题的。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>

struct student
{
	char _id[20];
	char _name[20];;
	int age_;
};
//初始化
void InitStudent(student *s,char *id, char *name, int age)
{
	strcpy(s->_id, id);
	strcpy(s->_name, name);
	s->age_ = age;
}
void PrintStudent(student *s)
{
	printf("%s-%s-%d\n", s->_id, s->_name, s->age_);
}

int main()
{
	struct student s1, s2;
	InitStudent(&s1, "001", "Peter", 18);
	PrintStudent(&s1);
	InitStudent(&s2, "001", "lisa", 18);
	PrintStudent(&s2);
	system("pause");
	return 0;
}

可以看到在C语言的的结构体中,初始化的时候多传了一个指针,有了这个指针,我们就可以知道要给哪一个结构体当中的变量赋值了,其实在C++中也传了一个指针,只是它被隐藏了,所以我们看不到,这就是this指针,this指针里面存放的就是当前对象的地址(即成员函数执行时,调用该成员函数的对象)。

#include <iostream>
#include <string>

using namespace std;
class student
{
public:
	void Init(string id, string name, int age)
	{
		this->id_ = id;
		this->name_ = name;
		this->age_ = age;
	}
	void print()
	{
		cout << this->id_ << endl;
		cout << this->name_ << endl;
		cout << this->age_ << endl;
	}
public:
	string id_;
	string name_;
	int age_;
};

int main()
{
	student s1, s2;
	s1.Init("001", "张三", 18);
	s1.print();
	s1.Init("002", "李四", 18);
	s1.print();
	s2.Init("001", "王五", 18);
	s2.print();
	s2.Init("002", "丽萨", 18);
	s2.print();
	system("pause");
	return 0;
}

上面的代码,我们把this指针写出来了,使用之后的结果和之前是一样的;

void Init(string id, string name, int age)
	{
		this->id_ = id;
		this->name_ = name;
		this->age_ = age;
	}
	void print()
	{
		cout << this->id_ << endl;
		cout << this->name_ << endl;
		cout << this->age_ << endl;
	}

注意

1.this指针是类类型* const,不能修改
2.this指针只能在“成员函数”内部指用
3.this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:从结构体开始理解this指针 的相关文章

随机推荐

  • 【网络】HTTP中的GET方法和POST方法

    1 GET方法 xff1a 获取资源 GET方法用来请求访问已被URL识别的资源 指定的资源经服务器端接续后返回内容 也就是说 xff0c 如果请求的资源是文本 xff0c 那就保持原样返回 xff1b 如果像是CGI xff08 Conm
  • 类的6个默认成员函数

    类的成员函数 1 构造函数2 析构函数3 拷贝构造函数4 深浅拷贝5 运算符重载赋值运算符重载的特性 xff1a 1 构造函数 xff08 构造函数的调用发生在对象的创建过程中 xff0c 所以会牵扯到this指针传对象的地址问题 另外创建
  • 通过onvif抓取海康摄像头图片,以及解决海康摄像头抓取图片需要验证问题,实现摄像头一段时间换一个地方的同时抓取一张图片。

    1 实现海康摄像头的图片的抓取 思路 xff1a 1 首先获取图片的url xff0c 2通过java实现图片的下载 1 使用onvif获取图片的url 首先获取OnvifDevice的对象 OnvifDevice od 61 new On
  • 超详细电烙铁如何使用?

    电烙铁是电子硬件工程师的一个必备工具了 它主要用来焊接一些电子元器件到PCB主板上 xff0c 用来做一些维修 xff0c 验证 xff0c 分析等等 那这么一个家伙要如何使用呢 xff1f 首先来看一个电烙铁的基本外观 xff1a 它一般
  • Makefile和cmake学习

    一 Makefile 一 什么是Makefile 1 Makefile 可以简单的认为是一个工程文件的编译规则 xff0c 描述了整个工程的编译和链接等规则 其中包含了那些文件需要编译 xff0c 那些文件不需要编译 xff0c 那些文件需
  • Ros下编译某功能包时出现很多“未定义的引用”的解决方法(本人版本是ubuntu18.04)

    问题描述 xff1a 在工作空间下编译某功能包时出现 在函数 中未被定义等问题 xff0c 如图所示 解决方案 xff1a 第一步 xff1a 查看自己的gcc版本和g 43 43 版本是否一致 xff0c 打开终端输入以下命令 gcc v
  • STM32—串口通讯详解

    串口通讯目录 物理层协议层USART简介开发板与上位机的连接代码讲解 xff1a 一 初始化结构体二 NVIC配置中断优先级三 USART配置函数讲解四 传输数据的函数 xff1a 1 发送一个字节2 发送字符串3 重定向printf函数发
  • 二进制数的算术运算和逻辑运算

    算术运算 二进制数加法采用逢二进一 减法采用借一作二 十六进制数加法采用逢十六进一 减法采用借一作十六 1位八进制可以写成3位二进制 xff0c 因为3位二进制可以表示十进制范围0 7 xff0c 也就是1位八进制的表示范围 1位十六进制可
  • STM32串口接收一帧数据方法(处理一帧数据中所需内容)

    stm32支持接受单个数据或者一帧数据 xff0c 若配置单个数据接收中断的话 xff0c 会出现接收包丢包 xff0c 数据不完整的情况 xff01 因此在stm32的串口中断中 xff0c 还有一个IDLE中断 xff0c 用来产生串口
  • 使用火狐拓展插件以及运行脚本的超详细方法

    1 首先我们需要下载火狐浏览器 火狐浏览器官网 xff1a 火狐浏览器 打开后默认页面 xff1a 2 如图所示点击右上角打开菜单 xff0c 然后点击附加组件 xff1a 3 进入该页面后在搜索框输入 xff1a tampermonkey
  • static关键字在c/c++中的作用

    static关键字在c c 43 43 中的作用 static在c语言中有三个作用 xff1a 修饰函数 修饰局部变量 修饰全局变量 被static修饰的全局变量被称之为静态全局变量 静态全局变量和全局变量在存储方式上是一致的 xff0c
  • licurl API

    这个文档是小编在curl官网上使用谷歌翻译翻译的 xff0c 详细信息看官网 curl 描述 这是关于C程序中如何使用libcurl的简单概述 xff0c libcurl程序的使用需要通过以下5个方面libcurl easy libcurl
  • C语言:最大公约数详解

    C语言 xff1a 最大公约数详解 Hello xff01 小伙伴们大家好 xff0c 几天不见了 xff0c 今天给大家分享一下C语言中求最大公约数的三种方法 在开始分享前 xff0c 让我们先来看看什么是最大公约数 xff1a 最大公约
  • Java:遍历数组的三种方法

    1 for循环遍历数组 用for循环遍历数组是很常见的一种方法 xff0c Java语言中通过数组的length属性可获得数组的长度 span class token keyword package span demo span class
  • Linux:进程创建详解

    Linux xff1a 进程创建详解 进程创建1 fork函数写时拷贝调用失败的原因 2 vfork函数 进程终止正常退出的三种方法 exit和exit的区别 进程创建 现在我们已经知道进程的概念以及怎样创建一个进程 xff0c 接下来我们
  • Linux:简单理解文件系统内附Linux内核设计与实现PDF下载地址

    简单理解文件系统 文件系统ext2文件系统文件的存储文件的获取 文件系统 文件存储的方式有线性存储和离散存储两种 xff0c 线性存储可能会导致磁盘的利用率降低 xff0c 产生磁盘碎片 xff0c 离散存储方式会提高程序对磁盘的利用率 x
  • Linux:网络编程——UDP编程的前期准备

    Linux xff1a 网络编程 UDP编程的前期准备 字节序TCP与UDP的区别UDP编程的流程1 创建套接字创建套接字的意义 2 绑定地址信息 xff08 1 xff09 绑定ip和端口 xff08 2 xff09 函数 3 UDP发送
  • Xshell连接虚拟机时报错Could not connect to ‘192.168.115.133‘ (port 22): Connection failed.

    Xshell连接虚拟机时报错Could not connect to 192 168 115 133 port 22 Connection failed 今天突然想把拨号连接换成宽带连接 结果问题就来了 用下Xshell连接虚拟机的时候一直
  • Linux:简单三步,教你解决ping:www.baidu.com:未知的名称或者服务

    Linux xff1a 简单三步 xff0c 教你解决ping www baidu com 未知的名称或者服务 1 在VMware Workstation中点开编辑 xff0c 找到虚拟网络编辑器2 直接点击更改设置3 点击还原默认设置 x
  • C++:从结构体开始理解this指针

    C 43 43 xff1a 从结构体开始理解this指针 span class token macro property span class token directive keyword include span span class