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:每个类编译后,是否创建一个类中函数表保存函数指针,以便用来调用函数?   普通的类函数(不论是成员函数,还是静态函数),都不会创建一个函数表来保存函数指针的。只有虚函数才会被放到函数表中。   但是,即使是虚函数,如果编译器能明确知道调用的是哪个函数,编译器就不会通过函数表中的指针来间接调用,而是会直接调用该函数

 

 

EJB商业探讨的白皮书

1 业界支持  任何一个商业化的技术要想拥有良好的市场态势,业界内重要企业的大量参与是十分重要的。J2EE是由SUN引导,各厂商共同发起的,并得到广泛认可的工业标准。业内企业计算领域的大企业如:IBM...
  • DrunkenLion
  • DrunkenLion
  • 2001-06-20 08:49:00
  • 663

成员函数及this指针的意义

同样受访问修改符的限制,被public修饰的可以被外部访问,被private修饰的则不能被外部访问class Object { public: int x; i...
  • linjingtu
  • linjingtu
  • 2016-07-08 00:17:32
  • 705

c++中类的成员函数调用剖析

此用一个小示例来说明c++中成员函数是怎么调用的
  • menglinaoxiang
  • menglinaoxiang
  • 2014-05-08 21:59:06
  • 2262

this指针指向当前调用对象,只是用于类的非静态成员函数。静态函数和全局函数 无当前对象,无this指针。

void Date::setMonth( int mn ) {      month = mn; // 这三句是等价的      this->month = mn;      (*this).mo...
  • hzw05103020
  • hzw05103020
  • 2016-03-02 23:06:10
  • 2158

C++随笔——成员函数的相互调用问题:

C++随笔——成员函数的相互调用问题:
  • u013555238
  • u013555238
  • 2017-10-03 23:08:16
  • 486

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

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

C/C++ - 类中成员变量是引用

C/C++ - 类中成员变量是引用CC - 类中成员变量是引用 C引用 不能有默认构造函数必须提供构造函数 构造函数的形参必须为引用类型 初始化必须在成员初始化链表内完成 C++引用引用在定义时必须初...
  • lazyq7
  • lazyq7
  • 2015-09-03 00:22:47
  • 5137

C++this的总结

今天看了几篇c++this 的博客,觉得讲得比较详细,于是把各篇的精华做个汇总。 1.什么是this 先要理解class的意思,class应该理解为一种类型,象int,char一样,是用户自定义的类型...
  • jx232515
  • jx232515
  • 2016-10-08 18:03:34
  • 7560

【C++】谈谈类定义里的this指针

在类的定义过程中,经常会使用到this关键字,那么我们来理解一下this指针在类定义中的作用。 this只能在成员函数中使用 全局函数、静态函数都不能使用this。实际上,成员函数默认第一...
  • xuqiang918
  • xuqiang918
  • 2014-11-04 14:39:04
  • 2035

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

1.一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐...
  • wz7654321
  • wz7654321
  • 2012-12-23 00:52:42
  • 4364
收藏助手
不良信息举报
您举报文章:C++基础:类与对象(对象调用成员函数 this指针)
举报原因:
原因补充:

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