目录
一、默认构造函数
二、析构函数
三、拷贝构造函数
四、赋值运算符重载
五、取地址及const取地址操作符重载
构造函数名字与类名相同,并且没有返回值。创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。
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 ; };
构造函数的任务不是开辟空间而是将对象初始化。怎么初始化可以自己在函数中设置,也可以不写构造函数,这时系统会自动生成一个默认的构造函数,该函数对类的内置类型属性不处理,对自定义类的属性会调用该属性的构造函数。
class A {} class Date { private: //内置类型 int _year; int _month; int _day; //自定义类型 A a; };
析构函数相对应构造函数,在对象生命周期结束之前调用一次析构函数,对该对象内部一些资源进行清理。
~Date() {}
其结构类型与构造函数相同,函数名是在类名前面加一个~,同样没有返回值。类中没有定义析构函数,系统会生成默认析构函数。该函数不会对内置类型属性处理,但若是有自定义类型属性,其会调用自定义类型属性的析构函数。
上边的构造函数使用成员属性类型的参数作为构造函数来初始化对象,当我们使用相同类型的类作为参数,这时候就称之为拷贝构造函数。
Date ( Date& d ) { _year = d.year ; _month = d.month ; _day = d.day ; }
同样的我们不写拷贝构造函数,系统也会自动生成一个默认拷贝构造函数,但需要注意该函数只是按字节序的值进行浅拷贝。
拷贝构造函数中的参数要带引用。因为对象传参时要调用拷贝构造函数,如果不使用引用那么就会陷入要传参就要就行拷贝构造,要拷贝构造就要先传参,这样的无限递归循环。
赋值运算符类似拷贝构造,我们可以将赋值运算符如下进行重载,也可以使用系统默认的赋值运算符,与默认拷贝构造相同也只是浅拷贝。
Date& operator=(const Date& d) { if(this != &d) { _year = d._year; _month = d._month; _day = d._day; } }
默认的赋值运算符与默认拷贝构造的主要区别就是,拷贝构造函数时将生成的对象拷贝给要创建的对象,而赋值针对的两个对象都是已经创建好的。
//拷贝构造 Date d1 = d2; Date d1(d2); //赋值 d1 = d2;
该操作符的重载也是如果我们不定义的话系统会自动生成。由于并不会有特别的需要,我们一般对取地址符不会去重载,就按照系统的默认重载来使用就行了。
Date* operator&() { return this ; } const Date* operator&()const { return this ; }