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++中引用和指针详解
先来分析指针这个东东: 从概念上讲,指针本质上就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 上面的图表示了程序运行时变量的值 ...
随机推荐
- 常用matlab函数(不定时更新)
直方图类: histc 直方图分组 示例 histc(a,0:1:10) 意义:将a(矩阵或向量)分组,分组设置为 0-1 1-2 2-3 -.. 9-10,(10-11) 百分位 prctil ...
- gitbook 入门教程之导出电子书
gitbook 既可以将源码文件单独输出,也可以仅输出单个文件,常见的导出电子书格式主要有三种(ePub, Mobi, PDF),而这三种格式都依赖于系统本身提供的 ebook-convert 工具. ...
- PHP面向对象的小总结
面向对象特性: *重用性 (每个模块都可以在项目中重复使用) *灵活性 (每个模块都很轻松被替换更改的) *拓展性(在模块上添加新功能是很方便的) 类和对象的关系(类生成对象) 物以类聚:相同特性的 ...
- 文件操作命令(move)
move命令: // 描述: 将一个或多个文件从一个目录移动到另一个目录. // 语法: move [{/y | /-y}] [<Source>] [<Target>] // ...
- python:过滤字符串中的字母数字特殊符号
今天遇到的字符串处理的问题,记录一下方便使用 str1 = input('请输入一个字符:') #初始化字符.数字.空格.特殊字符的计数 lowercase = 0 uppercase = 0 num ...
- java类加载及类初始化
1.前言 java是跨平台语言,主要是因为它的java虚拟机的存在,java有事编译语言,所以需要将编写的java文件编译成jvm可运用的class字节码文件.在java中一切皆对象.对于Java虚拟 ...
- 【Python 13】分形树绘制1.0--五角星(turtle库)
1.案例描述 2.案例分析 引入绘制图形的turtle库,利用库中函数进行编程. 3.turtle库 没有显示的input()和output(),没有赋值语句.调用形式大部分如下: import tu ...
- LVS负载均衡集群
回顾-Nginx反向代理型负载 负载均衡(load balance)集群,提供了一种廉价.有效.透明的方法,来扩展网络设备和服务器的负载.带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用 ...
- zabbix优化,配合文件,zabbix_get命令
一.配置文件优化 server端配置文件添加如下 StartPollers=160 #zabbix_server的进程数 StartPollersUnreacheable=80 #默认情况下,ZABB ...
- 线性回归和Logistic回归
目录 线性回归 用线性回归模型拟合非线性关系 梯度下降法 最小二乘法 线性回归用于分类(logistic regression,LR) 目标函数 如何求解\(\theta\) LR处理多分类问题 线性 ...