在介绍c++的默认构造函数之前呢,先简单的说下this指针。
· this指针
1.每个成员函数都有一个指针形参,它的名字是固定的成为this指针,this指针是隐式的(构造函数比较特殊,它不含this指针)。
2.编译器会对成员函数进行处理,在对象调用成员函数时,它会将对象的地址作为实参传递给成员函数的第一个形参this指针。
3. this指针是成员函数隐含指针形参,是编译器⾃⼰处理的,我们不能在成员函 数的形参中添加this指针的参数定义,也不能在调⽤时显⽰传递对象的地址给 this指针。
· 类的默认成员函数
1.构造函数
构造函数是对类中私有的成员变量初始化时所自动调用的函数,是对私有成员变量初始化所提供的一个共有借口。
构造函数有如下特征:
a.函数名与类名相同
b.无返回值
c.对象构造时系统自动调用
d.系统会默认提供一个构造函数,但其并不实现任何功能
e.⽆参的构造函数和全缺省值的构造函数都认为是缺省构造函数,并且缺省的构 造函数只能有⼀个。
· 带参的构造函数&无参的构造函数
#include<iostream>
using namespace std;
class Date
{
public:
//无参
Date()
{
cout << "Date()" << endl;
}
//带参
Date(int year,int month,int day)
{
cout << "Date(int year,int month,int day)" << endl;
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
void test()
{
Date d1;
Date d2(2017, 7, 17);
Date d3();//并没有调用d3的构造函数,d3本身就是一个无参的函数。
}
int main()
{
test();
system("pause");
return 0;
}
由运行结果可以看出在调用构造函数时,编译器会自动识别带参和无参的构造函数,可见构造函数时可以实现重载的。
· 缺省的构造函数与半缺省的构造函数(不常用)
#include<iostream>
using namespace std;
class Date
{
public:
Date(int year = 1990, int month = 1, int day = 1)
{
cout << "Date(int year = 1990, int month = 1,
int day = 1)" << endl;
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
备注:若缺省参数声明和定义分离,则可以在声明或定义中给默认参数
2.拷贝构造函数
创建对象时使⽤同类对象来进⾏初始化,这时所⽤的构造函数称为拷贝构造函数 ,拷贝构造函数是特殊的构造函数。
特征:
1. 拷贝构造函数其实是⼀个构造函数的重载。
2. 拷贝构造函数的参数必须使⽤引⽤传参,使⽤传值⽅式会引发⽆穷递归调⽤。
3. 若未显⽰定义,系统会默认缺省的拷贝构造函数。缺省的拷贝构造函数会,依 次拷贝类成员进⾏初始化。
#include<iostream>
using namespace std;
class Date
{
public:
Date(int year = 1990, int month = 1, int day = 1)
{
cout << "Date(int year = 1990, int month = 1, int day = 1)" << endl;
_year = year;
_month = month;
_day = day;
}
Date(const Date& d)
{
cout << "Date(const Date& d)" << endl;
_year = d._year;
_month = d._month;
_day = d._day;
}
private:
int _year;
int _month;
int _day;
};
void test()
{
Date d1(1997,1,1);
Date d2 = d1;
Date d3(d1);//与上面本质是一样的都是调用拷贝构造
}
int main()
{
test();
system("pause");
return 0;
}
分析运行结果可以得出在用同类型变量初始化时,调用拷贝构造函数。
3.析构函数
当⼀个对象的⽣命周期结束时,C++编译系统会⾃动调⽤⼀个成员函数,这个特殊 的成员函数即析构函数(destructor) 构造函数是特殊的成员函数,
特征如下:
1.析构函数在类名加上字符~。
2.析构函数⽆参数⽆返回值。
3. ⼀个类有且只有⼀个析构函数。若未显⽰定义,系统会⾃动⽣成缺省的析构函 数。
4. 对象⽣命周期结束时,C++编译系统系统⾃动调⽤析构函数
5. 注意析构函数体内并不是删除对象,⽽是做⼀些清理⼯作。
#include<iostream>
using namespace std;
class Date
{
public:
Date(int year = 1990, int month = 1, int day = 1)
{
cout << "Date(int year = 1990, int month = 1, int day = 1)"<< this << endl;
_year = year;
_month = month;
_day = day;
}
Date(const Date& d)
{
cout << "Date(const Date& d)" << this << endl;
_year = d._year;
_month = d._month;
_day = d._day;
}
~Date()
{
cout << "~Date()" << endl;
}
private:
int _year;
int _month;
int _day;
};
void test()
{
Date d1(1997,1,1);
Date d2 = d1;
Date d3(d1);
}
int main()
{
test();
system("pause");
return 0;
}
分析运行结果可以得出析构函数是自动调用的,先创建的对象后析构。
备注:
构造函数与拷贝构造函数都可以用初始哈列表的方式对类的变量进行初始化。这样做效率会更高一些。
本篇博客先介绍到这,下篇博客会介绍剩余三个默认函数。