1 构造函数
构造函数就是用类的名字作为函数名字的成员函数。
(1)一个类可以有多个构造函数
struct Student
{
Student() {};//默认构造函数 default constructor
Student(int age) {};//非默认构造函数
Student(int age, bool sex) {};//非默认构造函数
};
int main()
{
Student stu1;//调用默认构造函数
Student stu2(10);//调用带一个整形参数的构造函数
Student stu3(10, true);//调用两个参数的那个构造函数
return 0;
}
(2) 编译器合成的默认构造函数
如果我们一个构造函数都没有定义,编译器也会为我们合成一个默认构造函数(default constructor)。
struct Student
{
};
int main()
{
Student stu1;//调用编译器合成的默认构造函数(虽然我们没有看见那个函数在哪,编译器真是太热心了)
return 0;
}
(3)禁止编译器合成默认构造函数
只要我们自己定义了构造函数,编译器就不会再多管闲事替我们热心的合成一个默认的构造函数了。
下面的类已经没有默认构造函数了,因为我们定义了非默认构造函数,编译器不再替我们合成,而我们自己也没有定义默认构造函数。
struct Student
{
Student(int age) {};//非默认构造函数
Student(int age, bool sex) {};//非默认构造函数
};
int main()
{
Student stu2(10);//调用带一个整形参数的构造函数
Student stu3(10, true);//调用两个参数的那个构造函数
return 0;
}
这样的类也有一个不便之处,那就是像下面这样定义对象会报错:
如果要解决这个问题,就只能像一开始那样,自己显示的定义一个默认构造函数。
2 析构函数
2.1 类对象释放的时候会自动调用析构函数
#include <iostream>
using namespace std;
struct Student
{
Student(void) {//默认构造函数:没有参数
cout << "Student constructor called." << endl;
}
~Student(){//析构函数的执行是回收对象资源的最佳机会
cout << "Student destructor called." << endl;
}
};
int main()
{
cout << "main begin" << endl;
Student stu;//这里调用默认构造函数创建对象
cout << "main end" << endl;
return 0;
}//这里执行对象析构函数(对象超出作用域的时刻)
上述代码输出:
析构函数的执行
说明:大部分类并不需要定义析构函数。除非遇到非平凡的类。
说明: 如果没有定义析构函数会怎么样?
如果没有定义析构函数,编译器会自动合成一个析构函数。编译器合成的析构函数是依次调用各个成员变量的析构函数。