C++基础:类与对象(对象调用成员函数 this指针)

原创 2012年12月23日 00:52:42

1.一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

this指针的使用:

一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时使用this指针,如this->n = n (不能写成n = n)。

为什么要有this,this起到什么作用?话还是要从类和对象说起,定义一个对象,系统要给该对象分配存储空间,如果该类包含了数据成员和成员函数,就要分别给数据和函数的代码分配存储空间。按照正常额思路,如果类定义了2个对象,那么就应该分别给这2个对象的数据和函数分配空间。但事实并非如此,C++的编译系统只用了一段空间来存放在各个共同的函数代码段,在调用各个对象的成员函数时,都与调用这个公共的函数代码。因此,每个对象的存储空间都只是该对象数据成员所占用的存储空间,而不包括成员函数代码所占有的空间,函数代码是存储在对象空间之外的。但是问题就出来了,既然所有对象所调用的成员函数代码只是单独一封,那么成员函数是怎么知道当前调用自己的是哪一个对象呢?

  这时就诞生了this这个自引用的指针。每当创建一个对象时,系统就把this指针初始化为指向该对象,即this指针的值为当前调用成员函数的对象的起始地址。每当调用一个成员函数时,系统就把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时,C++编译器将根据成员函数的this指针所指向的对象来确定应该调用哪一个对象的数据成员。通过下面一个简单实例就可说明。

#include "stdafx.h"
 #include <iostream>
 #include <string>
 
 
 class Num
 {
 private:
 int a;
         std::string objectName;
 public:
         Num(std::string objectName,int a);
 void showNum();
 };
 
 Num::Num(std::string objectName,int a)
 {
 this->objectName=objectName;
 this->a=a;
 }
 
 void Num::showNum()
 {
     std::cout<<this->objectName<<":this="<<this<<" a="<<this->a<<std::endl;
 }
 
 
 int main()
 {
     Num num1("num1",1);
     Num num2("num2",2);
     Num num3("num3",3);
 
     num1.showNum();
     num2.showNum();
     num3.showNum();
 
 return0;
 }

结果:

-------------------------------------------------------------------------------------------------

 

关于this指针的一个经典回答:   

当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢? this是一个指针,它时时刻刻指向你这个实例本身。

---------------------------------------------------------------------------------------------

关于this的若干回答:

1:this只能在成员函数中使用。全局函数,静态函数都不能使用this。
2:由此可见,this在成员函数的开始前构造的,在成员的结束后清除。这个生命周期同任一个函数的参数是一样的,没有任何区别。   当调用一个类的成员函数时,编译器将类的指针作为函数的this参数传递进去。
3:this指针是什么时候创建的?   this在成员函数的开始执行前构造的,在成员的执行结束后清除。   
4:this指针存放在何处?堆,栈,全局变量,还是其他?   this指针会因编译器不同,而放置的位置不同。可能是栈,也可能是寄存器,甚至全局变量。   
5:this指针如何传递给类中函数的?绑定?还是在函数参数的首参数就是this指针.那么this指针又是如何找到类实例后函数的?   this是通过函数参数的首参数来传递的。this指针是在调用之前生成的。类实例后的函数,没有这个说法。类在实例化时,只分配类中的变量空间,并没有为函数分配空间。自从类的函数定义完成后,它就在那儿,不会跑的。   
6:this指针如何访问类中变量的/?   如果不是类,而是结构的话,那么,如何通过结构指针来访问结构中的变量呢?如果你明白这一点的话,那就很好理解这个问题了。   在C++中,类和结构是只有一个区别的:类的成员默认是private,而结构是public。   this是类的指针,如果换成结构,那this就是结构的指针了。   
7:我们只有获得一个对象后,才能通过对象使用this指针,如果我们知道一个对象this指针的位置可以直接使用吗?   this指针只有在成员函数中才有定义。因此,你获得一个对象后,也不能通过对象使用this指针。所以,我们也无法知道一个对象的this指针的位置(只有在成员函数里才有this指针的位置)。当然,在成员函数里,你是可以知道this指针的位置的(可以&this获得),也可以直接使用的。   
8:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?   普通的类函数(不论是成员函数,还是静态函数),都不会创建一个函数表来保存函数指针的。只有虚函数才会被放到函数表中。   但是,即使是虚函数,如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

回调函数中如何调用类中的非静态成员变量或非静态成员函数

回调函数中调用类中的非静态成员变量或非静态成员函数 【问题1】如何在类中封装回调函数? 【答】:   a.回调函数只能是全局的或是静态的。   b.全局函数会破坏类的封装性,故不予采用。 ...

C++在类的成员函数中,允许直接访问该类的成员对象的私有成员变量

问题(知识点)描述:   a .   在 C++ 的类的成员函数中,允许直接访问该类的对象的私有成员变量。   b .   在类的成员函数中可以访问同类型实例的私有变量。   c ....

c++指针对象调用成员函数

/************************************************************************* > File Name: t1.cpp > A...

C++基础:类与对象(构造 析构 赋值 拷贝构造)

C++中类的构造函数与析构函数,对象的赋值与复制,拷贝构造函数等。 和上一节一样,还是用Kid类来说明   建立对象并初始化:Kid kid(10,"rookie_j","男");另外一种使用n...

c++ 如何把this指针传入成员函数 像全局函数一样调用成员函数

测试这个功能的初衷是测试boost里面的bind boost::bind((&A::sum), &a, _1, _2) 上面的代码是我boost bind及多线程这篇博客里面的一行代码。我就像boo...

C++:对象数组、对象动态申请和释放、类的定义和实现分开、this指针、常成员函数、时钟

一、对象数组的定义和初始化 1. 对象数组的创建方法:   //常量都是无名对象 1)类类型 数组名[元素个数]; 2)类类型 数组名[元素个数] = { 数组的初始化列表... }; 2. ...

类和对象 , 四个默认成员函数及运算符重载 , 隐含的this指针

C++入门知识(2):1:类和对象:类(class):类的定义:类(class)实际上是一种高度抽象化的东西,百度上对类的定义是:类的实质是一种数据类型,类似于int、char等基本类型,不同的是它是...

C++调用空指针对象的成员函数——静态绑定与动态绑定

最近代码中看到调用空指针对象的成员函数的写法,联想起上次碰到的问题:C++类的成员函数存储方式(是否属于类的对象)两者的本质是一样的,上次只是简单地讨论了下,这次从编译器的角度,来谈一谈这个知识点。一...

C++成员函数 this指针 调用约定

摘要:介绍了如何取成员函数的地址以及调用该地址. 关键字:C++成员函数 this指针 调用约定 一、成员函数指针的用法   在C++中,成员函数的指针是个比较特殊的东西。对普通的函数指针来说,可以视...

2013级C++第6周(春)项目——对象指针、const【项目1-体验常成员函数】

/* * 程序的版权和版本声明部分 * Copyright (c)2013, 在校学生 * All rightsreserved. * 文件名称: 项目1.cpp * 作 者:刘旺 * 完成日期...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)