什么是this

this是一个const指针,存的是当前对象的地址,指向当前对象,通过this指针可以访问类中的所有成员。

当前对象是指正在使用的对象,比如a.print()a就是当前对象。

关于this

  1. 每个对象都有this指针,通过this来访问自己的地址。
  2. 每个成员函数都有一个指针形参(构造函数没有这个形参),名字固定,称为this指针,this是隐式的。
  3. 编译器在编译时会自动对成员函数进行处理,将对象地址作实参传递给成员函数的第一个形参this指针。
  4. this指针是编译器自己处理的形参,不能在成员函数的形参中添加this指针的参数定义。
  5. this只能在成员函数中使用,全局函数,静态函数不能使用this。因为静态函数没有固定对象。

this的使用

#include <bits/stdc++.h>
using namespace std;
class A {
private :
int a;
public :
A(int x = 0) : a(x) {}
void set(int x) {
a = x;
}
void print() {printf("%d\n", a);}
}; int main() {
A a, b;
int x;
a.set(111);
b.set(222);
a.print();
b.print();
return 0;
}

输出:

111

222

可以看出赋值的时候是分别给当前对象的成员赋的值。

就像上文中提到的3一样,拿set()函数来说,其实编译器在编译的时候是这样的

void set(A *this, int x) {
this->a = x;
}

何时调用

那什么时候要调用this指针呢?

1. 在类的非静态成员函数中返回对象的本身时候,直接用return *this

2. 传入函数的形参与成员变量名相同时

例如

#include <bits/stdc++.h>
using namespace std;
class A {
private :
int x;
public :
A() {x = 0;}
void set(int x) {
x = x;
}
void print() {
printf("%d\n", x);
}
}; int main() {
A a, b;
int x;
a.set(111);
b.set(222);
a.print();
b.print();
return 0;
}

输出是

0

0

这时因为我们的set()函数中,编译器会认为我们把成员x的值赋给了参数x;

如果我们改成这样,就没有问题了

#include <bits/stdc++.h>
using namespace std;
class A {
private :
int x;
public :
A() {x = 0;}
void set(int x) {
this->x = x;
}
void print() {
printf("%d\n", x);
}
}; int main() {
A a, b;
int x;
a.set(111);
b.set(222);
a.print();
b.print();
return 0;
}

这样输出的就是

111

222

而且这段代码一目了然,左值是类成员x,右值是形参x。

this指针详解的更多相关文章

  1. 【C++】智能指针详解(一):智能指针的引入

    智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引 ...

  2. c/c++指针详解(一)

    一:相关概念 1.指针数组:int *p[6]               是数组,是一个存放指针的数组,也就是里面存放的是地址. 2.数组指针:int (*p)[6]                 ...

  3. c/c++指针详解(二)

    指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占 ...

  4. Delphi指针详解

    Delphi指针详解2007-12-04 06:08:57|  分类: DLL学习 阅读91 评论0   字号:大中小 订阅 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用 ...

  5. [转]C++ 智能指针详解

    转自:http://blog.csdn.net/xt_xiaotian/article/details/5714477 C++ 智能指针详解 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每 ...

  6. C++ 智能指针详解(转)

    C++ 智能指针详解   一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常 ...

  7. C++指针详解 (转)

    C++指针详解 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区, ...

  8. 深入理解C语言 - 指针详解

    一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址.CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位.这里,数据对象是指存储在 ...

  9. C语言指针详解

    前言 这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文. 为什么需要指针? 指针解决了一些编程中基本的问题. 第一,指针的使用 ...

  10. C++中引用和指针详解

    先来分析指针这个东东: 从概念上讲,指针本质上就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 上面的图表示了程序运行时变量的值 ...

随机推荐

  1. 【面向对象设计原则】之单一职责原则(SRP)

    单一职责原则是面向对象原则五大原则中最简单,也是最重要的一个原则, 他的字面定义如下: 单一职责原则(Single Responsibility Principle, SRP): 一个类只负责一个功能 ...

  2. 每秒生成一千万个【可视有序】分布式ID的简单方案

    去年做了一个产品,会经常导入导出大量的外部数据,这些数据的ID有的是GUID类型,有的是字符串,也有的是自增.GUID类型没有顺序,结果要排序得借助其它业务字段,整体查询效率比较低:字符串ID本来是用 ...

  3. Android中将一个图片切割成多个图片

    有种场景,我们想将一个图片切割成多个图片.比如我们在开发一个拼图的游戏,就首先要对图片进行切割. 以下是封装好的两个类,可以实现图片的切割.仅供参考和学习. 一个是ImagePiece类,此类保存了一 ...

  4. SC命令

    描述:         SC 是用来与服务控制管理器和服务进行通信         的命令行程序. 用法:         sc <server> [command] [service n ...

  5. 【公众号系列】浅谈SAP项目管理的技能

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[[公众号系列]浅谈SAP项目管理的技能   写 ...

  6. Python运算符之翩若惊鸿,婉若游龙

    python中的运算符算术运算符:主要用于两个对象算数计算(加减乘除等运算)比较运算符:用于两个对象比较(判断是否相等.大于等运算)赋值运算符:用于对象的赋值,将运算符右边的值(或计算结果)赋给运算符 ...

  7. More Moore and More than Moore

    More Moore and More than Moore ——基于硅光电子学探讨摩尔定律的延续和发展 1965年4月,<电子学>杂志第114页上刊载了Intel创始人之一戈登·摩尔(G ...

  8. Allowed memory size of 134217728 bytes exhausted解决办法(php内存耗尽报错)【简记】

    报错: PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) i ...

  9. 使用opencv进行简单的手势检测[by Python]

    代码参考于:https://github.com/rainyear/lolita/issues/8 简单的手势识别,基本思路是基于皮肤检测,皮肤的颜色在HSV颜色空间下与周围环境的区分度更高,从RGB ...

  10. Spring Cloud:Security OAuth2 自定义异常响应

    对于客户端开发或者网站开发而言,调用接口返回有统一的响应体,可以针对性的设计界面,代码结构更加清晰,层次也更加分明. 默认异常响应 在使用 Spring Security Oauth2 登录和鉴权失败 ...