this指针详解
什么是this
this是一个const指针,存的是当前对象的地址,指向当前对象,通过this指针可以访问类中的所有成员。
当前对象是指正在使用的对象,比如a.print(),a就是当前对象。
关于this
- 每个对象都有this指针,通过this来访问自己的地址。
- 每个成员函数都有一个指针形参(构造函数没有这个形参),名字固定,称为this指针,this是隐式的。
- 编译器在编译时会自动对成员函数进行处理,将对象地址作实参传递给成员函数的第一个形参this指针。
- this指针是编译器自己处理的形参,不能在成员函数的形参中添加this指针的参数定义。
- 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指针详解的更多相关文章
- 【C++】智能指针详解(一):智能指针的引入
智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引 ...
- c/c++指针详解(一)
一:相关概念 1.指针数组:int *p[6] 是数组,是一个存放指针的数组,也就是里面存放的是地址. 2.数组指针:int (*p)[6] ...
- c/c++指针详解(二)
指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占 ...
- Delphi指针详解
Delphi指针详解2007-12-04 06:08:57| 分类: DLL学习 阅读91 评论0 字号:大中小 订阅 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用 ...
- [转]C++ 智能指针详解
转自:http://blog.csdn.net/xt_xiaotian/article/details/5714477 C++ 智能指针详解 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每 ...
- C++ 智能指针详解(转)
C++ 智能指针详解 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常 ...
- C++指针详解 (转)
C++指针详解 指针的概念 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区, ...
- 深入理解C语言 - 指针详解
一.什么是指针 C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址.CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位.这里,数据对象是指存储在 ...
- C语言指针详解
前言 这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文. 为什么需要指针? 指针解决了一些编程中基本的问题. 第一,指针的使用 ...
- C++中引用和指针详解
先来分析指针这个东东: 从概念上讲,指针本质上就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 上面的图表示了程序运行时变量的值 ...
随机推荐
- 虚拟主机、VPS主机与云服务器的区别
本文转载自星光云 http://www.365yun.top/news/list.asp?newsid=22 虚拟主机是利用虚拟技术将一台物理服务器划分成多个“虚拟”服务器,虚拟主机的出现大大节省了服 ...
- iOS----------计算一段代码执行时间
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); //在这写入要计算时间的代码 // do something CFAbsoluteTime end ...
- AspNetCore.FileLog 一款很不错的日志记录工具
AspNetCore.FileLog 该项目作者为伟哥,GitHub地址:https://github.com/amh1979:该项目维护者为鸟窝,GitHub地址:https://github.co ...
- Linux 环境 Maven 安装&仓源配置
索引: 目录索引 参看代码 GitHub: maven.txt 一.Linux (DeepinOS) 环境 1.官网下载 https://maven.apache.org/download.cgi 2 ...
- USB初学(一)---USB-HID的初步认识【转】
HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复习一下USB协议的相关内容. USB设备描述符-概述 当插入USB设备后,主机会向设备请求各种描述符来识别设备.那什么是设 ...
- 【学习】Linux Shell脚本实例之一
1.程序流程控制实例 程序流程控制,实际上就是改变程序的执行顺序.程序在执行过程中若流程被改变,就可能导致输出不同,因此利用这一特性就能够实现程序执行结果的控制.程序流程控制可分为“选择”和“循环”这 ...
- Asp.Net Core 全局模型验证
public class ActionFilter : IActionFilter { /// <summary> /// action 执行之前 /// </summary> ...
- 一、Windows Server 2016 AD服务器搭建
简介: AD是Active Directory的简写,中文称活动目录.活动目录(Active Directory)主要提供以下功能: 1)服务器及客户端计算机管理 2)用户服务 3)资源管理 4)桌面 ...
- day15-面向对象基础(二)
今天整理类的组合以及类的三大特性 1.类的组合 2.类的继承 3.类的封装 4.类的多态 开始今日份整理 1.类的组合 类与类之间,并不是独立的,很多的时候在正常使用的时候都是类与类之间互相调用,所以 ...
- token
18f9nWvThC274lo3USjgfeldynt0t/r/w0yjLbj9 http://app-static.acc5.com/app/testpost.php