说到C++中的类,其中一个非常方便的地方就是,当我们将某一类具有相同属性和行为的封装成一个类后, 我们只需要用该类型创建不同的对象,那么就可以生成很多对象实例,
类是对对象的抽象,它是一种抽象的数据类型,是一个抽象的概念,对象是对客观事物的抽象。
对象是类的实例,类是对象的模板,万物皆为对象,对象属于某个类,
对象的唯一来源于世界中事物的唯一;
对象的唯一在程序中是地址内存的唯一;那么我们怎么用不同的对象或指针来找到其对应的内存地址呢???
这里就来到了文中的this指针,一个很重要的隐士,默默的在后面做着贡献和牺牲,类中的无名英雄!!
从来不让人知道!捧着一颗心来,不带半颗草去!!
this的作用:
一个对象的this指针并不是这个类的一部分,不影响sizeof(对象)的大小。this作用域是在类的内部,当在类的非静态成员函数中访问非静态成员的时候,编译器就会自动将对象本身的地址作为一个隐含的参数传递给函数!
this不是类的成员变量,我们可以通过sizeof(对象)来确定;
每一个类的成员函数都有一个隐含的参数,当前这个类的指针->this,地址和该类生成的对象的地址一样。
this指向的是各个对象的地址;主要用来区分那个类的成员变量,那个对象调用就把那个对象的地址传给成员函数的this指针,然后去找对应对象的成员变量;
注意:一定是成员函数和成员变量,非成员函数,如静态成员函数的成员函数的区别就是静态成员函数没有this指针,所以它不能调用某个对象的成员变量,分不清是呢个对象的!
下面看一个代码示例:
#include <iostream>
using namespace std;
class people
{
public:
int num; //全局的变量;
int data;
public:
people(int num,int data)
{
// num=123; //局部的变量;
num=123;//局部的变量;
data=234;
people::num=888; //调用全局的变量; 类名加作用域来区分变量的作用域;
this->num=888; //全局的变量;
this->data=999;
}
void show()
{
cout<<this<<endl; //当前对象的地址;
}
void show1()
{
cout<<this->num<<endl;
}
void show2()
{
cout<<"adfsf"<<endl;
}
};
int main()
{
people pe(100,200);
cout<<&pe<<endl;
pe.show(); //this 指针的地址和类对象的地址是一样的;
people peo(100,200);
cout<<&peo<<endl;
peo.show();//this 两个地址是一样的;
people *pp=NULL;//pp指向NULL,可以调用函数,但是函数里不能有类的属性。里面没有任何变量;
//pp.show1();//pp没有对象,所以不能调用类中的变量;
pp->show2();//pp可以调用函数;函数的地址已经生成,找到地址就可以用,但是累的变量它找不到地址;
cout<<pe.num<<endl;//888 num的值是;-858993460
cout<<sizeof(people)<<endl;//8 成员变量的总的大小;
system("pause");
return 0;
}
1.this指针就是当前对象的首地址;
2.空指针NULL可以调用不含有成员变量的函数,因为只要找到函数的入口地址就可以调用该函数;
3.静态函数没有this指针,不能访问成员变量;用类名就可以调用;