第一:构造函数与析构函数
什么是构造函数?构造函数在对象实例化时被系统自动调用,仅且调用一次,构造函数出现在哪里?前面学过类,实际上定义类时,如果没有定义构造函数和析构函数,编译器就会生成一个构造函数和析构函数,只是这个析构函数和构造函数什么事情也不做,所以我们不会关注到这一点。
构造函数的特点如下:
1、构造函数必须与类同名;
2、可以重载;
3、没有返回类型,即使是void也不行;
什么是析构函数?与构造函数相反,在对象结束其生命周期时系统自动执行析构函数。实际上定义类时,编译器会生成一个析构函数。
1、析构函数的格式为 ~类名();
2、调用释放内存(资源);
3、~类名()不能加参数;
4、没有返回值,即使void也不行
通过简单的例子来说明构造函数和析构函数的使用方法:
#include <iostream> #include <string> using namespace std; class Dog { public: Dog(); ~ Dog(); }; int main() { Dog dog; cout<<"构造与析构函数示例"<<endl; return 0; } Dog::Dog() { cout<<"构造函数执行!"<<endl; } Dog::~Dog() { cout<<"析构函数执行!"<<endl; }
分析:其实执行的结果可以预测,在对象实例化时会调用构造函数,所以构造函数先执行,然后再执行main()函数中的内容,继续执行cout<<"构造函数与析构函数",最后结束的时候运行析构函数。
第二:this指针
一个类中的不同对象在调用自己的成员函数时,其实它们调用的是同一段函数代码,那么
成员函数如何知道要访问哪个对象的数据成员呢? 没错,就是通过 this 指针。每个对象都拥有一个 this 指针,this 指针记录对象的内存地址。在 C++中,this 指针是指向类自身数据的指针,简单的来说就是指向当前类的当前实例对象。
关于类的 this 指针有以下特点:
(1) this 只能在成员函数中使用,全局函数、静态函数都不能使用 this。实际上,成员函数
默认第一个参数为 T * const this。也就是一个类里面的成员了函数 int func(int p),func 的原
型在编译器看来应该是 int func(T * const this,int p)。
(2) this 在成员函数的开始前构造,在成员函数的结束后清除。
(3) this 指针会因编译器不同而有不同的放置位置。可能是栈,也可能是寄存器,甚至全
局变量。
#include <iostream> #include <string> using namespace std; class Dog { public: string name; void func(); }; int main() { Dog dog; dog.func(); return 0; } void Dog::func() { this->name = "旺财"; cout<<"小狗的名字叫:"<<this->name<<endl; }
分析:this只能能够在成员函数中使用,并可以指向自身数据。