(一)构造函数
(1)定义
-
构造函数是一种特殊的成员函数,在创建对象时自动调用。
-
构造函数的名称必须与类名完全相同。
-
构造函数没有返回类型,连void也不允许。
-
如果没有定义构造函数编译器会生成一个默认的无参构造函数。
无参构造函数 类名() 有参构造函数 类名(参数 1 , 参数 2 ...)
(2)功能
- 初始化对象 构造函数的主要功能是初始化对象的数据成员。这可以通过在构造函数的参数列表中传递初始值,或者在函数体内部设置默认值来实现。
- 分配资源 在某些情况下,构造函数可能需要为对象分配资源,如动态内存、文件句柄、网络连接等。这些资源在对象生命周期内被对象使用,并在析构函数中释放。
(2)调用时机
- 构造函数在对象实例化时自动调用,与new运算符一起使用。
- 数组对象会根据数组中元素的个数去完成相应数量构造函数的调用。
- 示例代码:
- 栈区
先实例化对象的先调用构造函数 先实例化对象的后调用析构函数 类似数据结构中的 “栈” - 先进后出
#include <iostream>
#include <string>
using namespace std;
class demo
{
private:
int num;
public:
demo(int num) // 系统自动调用
{
this->num = num;
cout << "我是无参构造函数 " << num << endl;
}
~demo() // 系统自动调用
{
cout << "我是析构函数 " << num << endl;
}
};
int main(int argc, char const *argv[])
{
// 栈区
// 先构造的后析构
demo d_1(1);
demo d_2(2);
demo d_3(3);
return 0;
}
/*
我是无参构造函数 1
我是无参构造函数 2
我是无参构造函数 3
我是析构函数 3
我是析构函数 2
我是析构函数 1
*/
- 堆区
先使用new实例化对象的先调用构造函数 先用delete
释放动态空间的先调用析构函数
#include <iostream>
#include <string>
using namespace std;
class demo
{
private:
int num;
public:
demo(int num) // 系统自动调用
{
this->num = num;
cout << "我是无参构造函数 " << num << endl;
}
~demo() // 系统自动调用
{
cout << "我是析构函数" << num << endl;
}
};
int main(int argc, char const *argv[])
{
// 堆区
// 先释放的先析构
demo *p_1 = new demo(1);
demo *p_2 = new demo(2);
demo *p_3 = new demo(3);
delete p_2;
delete p_1;
delete p_3;
return 0;
}
/*
输出结果:
我是无参构造函数 1
我是无参构造函数 2
我是无参构造函数 3
我是析构函数2
我是析构函数1
我是析构函数3
*/
(3)构造函数重载
- 重载的构造函数名称都相同即都是类名。
- 重载的构造函数具有唯一的参数列表,可以是参数的数量不同、参数的类型不同,或者参数的顺序不同。
- 注意 函数的重载不能有二义性。
- 示例代码:
#include <iostream>
#include <string>
using namespace std;
class demo
{
private:
int num;
public:
demo()
{
cout << "无参构造函数" << endl;
}
demo(int num)
{
this->num = num;
cout << "有参构造函数 " << num << endl;
}
};
int main(int argc, char const *argv[])
{
demo d_1;
demo d_2(10);
return 0;
}
/*
输出结果:
无参构造函数
有参构造函数 10
*/
(4)初始化列表
(5)拷贝构造函数
(二)析构函数
(1)定义
-
析构函数是一种特殊的成员函数,它在对象的生命周期结束时被自动调用。
-
析构函数不接受任何参数,也不返回任何值。
-
析构函数的名称与类名相同,但前面有一个波浪号(~)作为前缀。
析构函数 ~类名()
(2)功能
- 析构函数的主要功能是释放对象在生存期间可能分配或占用的资源,如内存、文件句柄、网络连接等。
待写…