一,this指针
首先,我们先观察以下类:
#include <iostream> using namespace std; class Date { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } void Print() { cout << _year << "-" << _month << "-" << _day << endl; } private: int _year; int _month; int _day; }; int main() { Date d1, d2; d1.Init(2022, 1, 11); d2.Init(2022, 1, 12); d1.Print(); d2.Print(); return 0; }
对于上述类,有这样的一个问题: Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函 数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢? C++中是通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(即此类),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。如下图:
class Date { public: void Init(int year, int month, int day) { _year = year; _month = month; _day = day; } //void Print(Data* this),错误,不能显示的写实参和形参,里面默认就有this指针 void Print() { //我们不能在形参中写,但是可以在类里面使用,因为默认有this指针 cout << this->_year << "-" << this->_month << "-" << this->_day << endl; cout << _year << "-" << _month << "-" << _day << endl; } private: int _year; int _month; int _day; };
这里需要说明以下几个问题:
1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
2. this指针只能在“成员函数”的内部使用。
3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针。
4. this指针是“成员函数”第一个隐含的指针形参,而形参跟函数一样存储在栈区中,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。
二,构造函数
介绍:
构造函数:在创建对象时,自动的进行初始化工作。语法:类名() {...}
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。
特征:
1,构造函数的访问权限一般情况下要设置为public,设置为private将无法访问构造函数,导致建立类时自动访问将会出错。
2,函数名必须与类名相同。
3,没有返回值,也不写void。
4,可以有参数,可以重载,可以有默认参数。
5,创建对象时会自动调用一次,不能手工调用。
这里需注意以下几点:
1,如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明。
2,构造函数的权限若设置为private将会将会出错,因为权限不可访问。
3,如果定义了许多类,构造函数将会按照先后顺序调用。
默认构造函数:
如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类 型,如:int/char...,自定义类型就是我们使用class/struct/union等自己定义的类型,而编译器生成的默认构造函数只会对自定类型成员调用它的构造函数,内置类型一般不做处理,但有些编译器会对其进行处理(这里建议都看成不处理),即只处理自定义类型,为解决这一问题,在C++11标准中,内置类型成员变量在类中声明时可以给默认值。
内置类型是编译器自己定义的,所以一般都会自动给它们初始化,但内置类型不知是如何实现的,所以不会处理,需要自己定义构造函数进行处理。
综上所述:在平常中,最好自己定义构造函数,默认构造函数可以看成自动生成随机值。
样例示范1:
#include <iostream> using namespace std; class Date { public://设置为公有权限,否则相当于建立时将会出错 // 1.无参构造函数 Date() {} // 2.带参构造函数 Date(int year, int month, int day) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; int main() { Date d1; //定义一:调用无参构造函数 Date d2(2015, 1, 1); //定义二:调用带参的构造函数 Date d3(); //定义三:此种定义是函数的声明,声明了d3函数,该函数无参,返回一个日期类型的对象 return 0; }
C++:this指针和构造与析构的运用--2https://developer.aliyun.com/article/1424576