this指针
同一类的各个对象创建后,都在类中产生自己成员的副本。而为了节省存储空间,每个类的成员函数只有一个副本,成员函数由各个对象调用。
那么对象在副本中如何与成员函数建立关系?c++为成员函数提供了一个称为this的指针,当创建一个对象的时候,this会自动初始化指向该对象,当某一个对象调用一个成员函数的时候,this指针将作为一个变量传递给该函数。所以,不同的对象调用一个成员函数的时候,编译器会根据this指针来确定应该引用哪一个对象的数据成员。
下面用代码来初步认识一下this指针:
#include<iostream> using namespace std; class Point { public: Point(int =0,int =0); void displayxy(); private: int X, Y; }; Point::Point(int x,int y)//双参构造函数; { X = x; Y = y; } void Point::displayxy() { cout << X << endl; //cout<<this->X<<endl; cout << Y << endl; //cout<<this->Y<<endl; } //在这里我们可以看到,this指针是一种隐函数对象指针,它指向的是该函数的数据成员; int main(void) { Point obj1(10, 20), obj2(8, 9), * p; p = &obj1;//p指向对象obj1; p->displayxy(); p = &obj2;//p指向对象obj2; p->displayxy(); }
通过上述代码,我们可以发现,this指针并不会被表示出来,也就说明它是一个隐含对象指针。
那么this指针有哪些属性喃?
this指针的属性
this是一个局部量,局部于某个对象 this是一个常量,它不能作为赋值,递增,递减等运算的目标对象
只有非静态类成员函数才拥有this指针并通过该指针来处理对象 实际中,通常不去显示使用thi是指针引用数据成员和成员函数
子对象和堆对象
1.子对象的声明*
一个对象作为另一个类的成员时,该对象称为该类的子对象。子对象实际上也是某个类的成员。
*
//c++面向对象——类 #include<bits/stdc++.h> using namespace std; class MyClass { public: MyClass(int =0,int =0);//无参构造函数; ~MyClass();//析构函数; void destroyxy(); private: int X, Y; }; //构造函数; MyClass::MyClass(int x,int y) { X = x; Y = y; cout << "Destroy is called!" << endl; } //构造析构函数; MyClass::~MyClass() { cout << "Destroy is called!!!" << endl; } void MyClass::destroyxy() { cout << "Destroy is called!"; cout << setw(4) << "(" << this->X << "," << this->Y << ")" << endl; } class Whole { public: Whole(int); Whole(int, int); ~Whole(); private: MyClass p1, p2;//子对象; }; Whole::Whole(int x) { cout << "Construct of Whole" << endl; cout << x << endl; } Whole::Whole(int x, int y) :p1(x), p2(y) { cout << "Construct is called" << endl; } Whole::~Whole() { cout << "end of this" << endl; } int main(void) { Whole whole(3, 4); Whole w(3); }
通过上面的代码我们可以很明确的看出有一行代码的格式:Whole::Whole(int x, int y) :p1(x), p2(y)
那么这行代码又代表什么意思喃?
2.子对象的初始化
为初始化子对象,X的构造函数要调用这些对象成员所在类的构造函数,于是X类的构造函数中就应该包含数据成员初始化列表,用来给于对象进行初始化;
<类>::<类>(<参数>):<成员1>(参数),<成员2>(参数)~~
{
~~
}
注意:冒号后由逗号隔开的想组成数据成员初始化列表,成员初始化列表是由一个或者多个项组成,多个选项之间由逗号隔开。可以是对子对象进行初始化,也可以是对该类中其他的数据成员初始化。对子对象的构造函数的调用函数的舒徐取决于这些子对象在类中的说明顺序,与数据成员初始化列表顺序无关。
堆对象
堆对象是指在程序运行时根据需要随时可以被创建和删除的对象,在虚拟的程序空间中存在一些空闲存储单元,这些存储单元组成我们所谓的堆。
c++程序的内存格局通常分为4个区:
创建和删除堆对象可以用如下两个运算符,new,delete;
l下面我们用一段代码来认识这两种运算符的用法;
#include<iostream> using namespace std; class Heapclass { public: Heapclass();//构造函数; ~Heapclass();//析构函数; private: int i; }; Heapclass::Heapclass() { cout << "Default Constructor is called." << endl; } Heapclass::~Heapclass() { cout << "Destructor is called" << endl; } int main(void) { Heapclass* ptr; ptr = new Heapclass[2];//申请动态空间表明有两个元素,每个元素都是该类的对象; if (ptr) { cout << "Out of Memory!" << endl; } cout << "Exit main" << endl; delete[]ptr; return 0; }
通过程序运行结果我们可以发现,最后释放对象的时候,调用了两次析构函数,创造对象的时候,一共调用了2次构造函数,所以,通过这里,我们也不难发现构造函数和析构函数的用途;