C++中关于this指针的入门介绍

目录
  • 简介
  • 特性
  • 举例
  • 注意

简介

C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参

数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成

特性

1. this指针的类型:类类型* const

2. 只能在“成员函数”的内部使用

3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this

形参。所以对象中不存储this指针。

4. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

举例

class Data {
public:
	void Printf()
	{
		cout << _year <<" "<<" "<< _month <<" "<< _day << endl;
	}
	void Init(int year=2022,int month=5,int day=25)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	Data d1,d2;
	d1.Init(2022,1,1);
	d1.Printf();
	d2.Init(2022,2,2);
	d2.Printf();
	return 0;
}

这是一个简单的日期类,那么这里有一个问题,我们在使用打印函数Printf和初始化函数Init的时候,d1和d2调用的是同一个函数,那么编译器是怎么知道我是应该设置/打印d1还是d2呢?

这其实就使用了this指针

那么具体编译器是怎么做的呢?

void Printf(const* this)//编译器实际上处理的
	{
		cout << this->_year << " " << this->_month << " " << this->_day << endl;
	}
	void Printf()//我们看到的
	{
		cout << _year <<" "<<" "<< _month <<" "<< _day << endl;
	}
void Init(const* this,int year=2022,int month=5,int day=25)//编译器处理的
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}
	void Init(int year = 2022, int month = 5, int day = 25)//我们看到的
	{
		_year = year;
		_month = month;
		_day = day;
	}
d1.Init(2022,1,1);//我们看到的
	d1.Init(&d1,2022, 1, 1);//编译器实际上处理的

实际上编辑器取了d1和d2函数的地址,然后传递给了const*this,这样编译器就能自动打印和初始化相应的结构了。

注意

我们不能自己在传参处加const*this和&,这是编译器自己做的,我们不能抢了编译器的活,即使做了,编译也不会通过,但是里面我们可以加

void Printf(const* this)//错误
	{
		cout << _year <<" "<<" "<< _month <<" "<< _day << endl;
	}
void Printf()//可以运行,但是编译器默认都会加this->,所以我们可以不用加,加了也没事
	{
		cout <<this-> _year <<" "<<" "<< this->_month <<" "<< this->_day << endl;
	}

到此这篇关于C++中关于this指针的入门介绍的文章就介绍到这了,更多相关C++ this指针内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++深入浅出讲解隐藏this指针的用法

    目录 1.this指针的引出 2.this指针的特性 3.练习一下 本篇文章我们将一起讨论在有趣的知识点--隐藏的this指针.本篇我们要使用到之前我们所学习到的C++类与对象,如果有各位小伙伴还不曾了解类与对象的简单思想,可以访问上篇: 在之后的学习中,我们将认识一个新的类:日期类Date.正如我们所想的那样,传入一个日期,我们可以输出我们所输入的日期. 1.this指针的引出 那我们首先来看一下,这段代码会输出什么结果呢? class Date { public: void Display(

  • C++超详细讲解内存空间分配与this指针

    目录 成员属性和函数的存储 空对象 成员属性的存储 成员函数的存储 this指针的概念 解决名称冲突 返回对象指针*this 总结 成员属性和函数的存储 在C++中成员变量和成员函数是分开存储的: 空对象 class Person {}; 这里我直接创建一个空的类,并创建一个空的类对象(Person p),利用sizeof关键字输出p所占内存空间,sizeof(p);结果是p=1: 注意:空对象占用内存空间为: 1.C++编译器会给每个空对象分配一个字节空间,是为了区分空对象占内存的位置 2.每

  • C++静态成员函数和this指针详解

    目录 静态成员 1.静态成员变量 2.静态成员函数 成员变量和成员函数分开存储 this 指针 空指针访问成员函数 总结 静态成员 静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员 静态成员分为: 1.静态成员变量 所有对象共享同一份数据 在编译阶段分配内存 类内声明,类外初始化 示例: #include<iostream> using namespace std; class Person { public: static int m; // 所有对象共享同一份数据 }

  • C++深入探究类与对象之对象模型与this指针使用方法

    目录 C++对象模型和this指针 1 成员变量和成员函数分开存储 2 this指针概念 3 空指针访问成员函数 4 const修饰成员函数 C++面向对象的三大特性为:封装.继承.多态 C++认为万事万物都皆为对象,对象上有其属性和行为 例如: ​ 人可以作为对象,属性有姓名.年龄.身高.体重…,行为有走.跑.跳.吃饭.唱歌… ​ 车也可以作为对象,属性有轮胎.方向盘.车灯…,行为有载人.放音乐.放空调… ​ 具有相同性质的对象,我们可以抽象称为类,人属于人类,车属于车类 C++对象模型和th

  • C++中this指针理解及作用

    目录 01.C++程序到C程序的翻译 02.this指针的作用 03.this指针和静态成员函数 04.小结 01.C++程序到C程序的翻译 想要理解C++语言中的this指针,下面我们做一个举例,我们要先把下面的C++代码转换成C代码: (1)大家知道,C语言中没有类定义class关键词,但是有跟class类似的定义关键词,就是struct结构体定义.m_height变量是Tree类的成员变量,那么我们就可以把Tree类和成员变量翻译成下面的C代码: (2)SetHeight函数是Tree类的

  • C++this指针详情

    还是Stock股票这个类,假设我们要实现一个方法,比较一下当前股票和传入的股票, 返回价格高的那个股票.在我们实现的时候,会遇到一点问题. const Stock & Stock::topVal(const Stock &s) const {     if (s.total_val > total_val) {         return s;     }else {         return ????;     } } 这段代码当中有一些问题,我们一个一个来说. 首先说函数签

  • 一起来学习C++中类的this指针以使用

    目录 一,this指针的注意点 错误用例: 二,this指针存在哪里 三,this指针的面试坑题 总结 c++的类中,非静态的成员函数都有一个隐藏的this指针,在函数体中所以的成员变量都是通过this指针来访问的.但是this指针是对用户是透明的,用户不需要显示的给this指针传参,编译时会自动接收参数. 一,this指针的注意点 调用成员函数时,不可以显示给this指针传参 定义成员函数时,不能显示的声明this指针 在成员函数内部,可以显示的使用this指针 用一个日期类,来讲述this指

  • C++函数指针+对象指针+this指针+指向类静态和非静态成员的指针

    目录 1.指向函数的指针 2.对象指针 3.this指针 4.指向类的非静态成员的指针 5.指向类的静态成员的指针 1.指向函数的指针 函数的代码在内存中的首地址,是由函数名表示的,也就是说函数名等价于函数代码首地址.因此,可以定义一个指向函数的指针,即函数指针.函数指针定义和赋值的语法如下,其中数据类型代表指向函数的返回类型,形参表为指向函数的形参表:赋值时必须保证指向的函数名和函数指针的返回类型和形参完全相同: 数据类型 (*函数指针名)(形参表);函数指针名 = 函数名; 下面的例子定义了

  • C++简明图解this指针的使用

    目录 成员数据和成员函数的存储方式 this指针的引入 this指针概述 this指针的使用 c++的封装性:将数据 和 方法 封装在一起 数据 和 方法 是分开存储. 每个对象 拥有独立的数据. 每个对象 共享同一个方法. 成员数据和成员函数的存储方式 1.成员函数不占类的空间 2.静态成员数据不占类的空间 this指针的引入 class Data { public: int m_num; void setNum(int num) { m_num = num; } }; void test01

  • C++中关于this指针的入门介绍

    目录 简介 特性 举例 注意 简介 C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参 数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问.只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成 特性 1. this指针的类型:类类型* const 2. 只能在“成员函数”的内部使用 3. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this 形参.所以对象中不存储this

  • SQL Server中row_number函数用法入门介绍

    目录 一.SQL Server Row_number函数简介 二.Row_number函数的具体用法 1.使用row_number()函数对结果集进行编号 2.对结果集按照指定列进行分组,并在组内按照指定列排序 3.对结果集按照指定列去重 总结 一.SQL Server Row_number函数简介 ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数. 行号以每个分区中第一行的行号开头. 语法实例: select *,row_number() over(

  • 浅谈JavaScript中的this指针和引用知识

    this是javascript的一个关键字,随着函数使用场合不同,this的值会发生变化.但是总有一个原则,那就是this指的是调用函数的那个对象. this指针在传统OO语言中,是在类中声明的,表示对象本身.在JavaScript中,this表示当前上下文,即调用者的引用 ********this永远指向的是(函数对象)的所有者 this和全局对象: var a = 1; function foo(){ var b = 2; console.log(this.a+b);//3 } foo();

  • J2ME编程中的几个重要概念介绍

    我们都知道,Java ME 以往称作J2ME(Java Platform,Micro Edition),是为机顶盒.移动电话和PDA之类嵌入式消费电子设备提供的Java语言平台,包括虚拟机和一系列标准化的Java API.它和Java SE.Java EE一起构成Java技术的三大版本,并且同样是通过JCP(Java Community Process)制订的. J2ME平台中有几个重要的概念,例如内存.CLDC.MIDP等.初学J2ME往往对这些概念理解不深,甚至出现偏差.本文的目的在于对J2

  • C++中auto_ptr智能指针的用法详解

    智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势,但也有其局限.本文总结的8个问题足以涵盖auto_ptr的大部分内容. auto_ptr是什么? auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个拥有者.当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有

  • MyBatis入门介绍(超简单)

    MyBatis 简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects

  • Ruby入门介绍第1/5页

    一.方法 Ruby 的方法定义允许为参数设置默认值,不过在带有默认值的参数后面不能出现不带有默认值的参数(允许 * 和 &),也就是说下面的方法定义是不被允许的,解释时会出现 parse error. 还有一点与 C# 不同的是,方法定义不能出现在方法调用的后面. # parse error def Display(args1="proshea", args2) end # 允许 def Display(args1="proshea", *args2) en

  • 详解C语言中的常量指针和指针常量

    概述 对于新手来说,指针在c语言里总是一个非常难以理解的概念.在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区别 常量指针 让我们先来理解什么是常量指针.常量指针是指指针指向的地址是常量.换句话说,一旦常量指针指向了一个变量,你不能让该常量指针指向其他变量了 常量指针的声明方法如下: <type of pointer> * const <name of pointer> 常量指针声明示例:

  • struts2入门介绍及代码实例

    Struts2的控制器是一个过滤器,Struts中的Action就相当于在基本MVC设计模式当中一个个独立的servlet,并由Action调用模型层(JavaBean)完成一个个具体的业务功能. 在struts2中创建一个例子 新建WEB工程,然后在工程上右键选择Myeclipse–>addstrutsCapabilities,界面中选择struts2,然后点击finish,结束后你会在src文件下面看到struts的配置文件struts.xml. 然后就是在web.xml文件中配置过滤器,配

  • golang中值类型/指针类型的变量区别总结

    前言 值类型:所有像int.float.bool和string这些类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,值类型的变量的值存储在栈中.当使用等号=将一个变量的值赋给另一个变量时,如 j = i ,实际上是在内存中将 i 的值进行了拷贝.可以通过 &i 获取变量 i 的内存地址 指针类型:简单地说go语言的指针类型和C/C++的指针类型用法是一样的,除了出去安全性的考虑,go语言增加了一些限制,包括如下几条: 不同类型的指针不能互相转化,例如*int, int32, 以及int

随机推荐