构造函数和析构函数
最编程
2024-10-06 18:55:21
...
构造函数是一种特殊的成员函数,用于在创建对象时初始化对象。它具有与类名相同的名称,并且不返回任何值,也没有返回类型。构造函数可以重载,以允许不同类型的初始化。
构造函数的特性:
- 自动调用:当创建对象时,构造函数会自动被调用
- 初始化成员变量:构造函数用于初始化对象的成员变量
- 没有返回值:构造函数不返回任何值,也不返回void
- 可以重载:可以有多个构造函数,只要它们的参数列表不同
#include <iostream>
class Person {
public:
// 默认构造函数
Person() {
std::cout << "默认构造函数" << std::endl;
}
};
int main() {
Person jack; // 创建Person对象,会自动调用默认构造函数
Person jane; // 创建Person对象,会自动调用默认构造函数
return 0;
}
---------
默认构造函数
默认构造函数
#include <iostream>
class Person {
public:
std::string p_name;
int p_age;
// 默认构造函数,并对成员变量进行初始化
Person() : p_name("Jack"), p_age(18) {
std::cout << "姓名:" << p_name << std::endl;
std::cout << "年龄:" << p_age << std::endl;
}
};
int main() {
Person jack; // 创建Person对象,会自动调用默认构造函数
return 0;
}
---------
姓名:Jack
年龄:18
#include <iostream>
class Person {
public:
std::string p_name;
int p_age;
// 重载构造函数,并将传入的参数赋给成员变量
Person(const std::string& name, const int& age) : p_name(name), p_age(age) {
std::cout << "成员变量:" << p_name << " " << p_age << std::endl;
std::cout << "参数:" << name << " " << age << std::endl;
}
};
int main() {
std::string str = "lussy";
int num = 20;
Person jack(str, num); // 创建Person对象,并调用重载构造函数
return 0;
}
---------
成员变量:lussy 20
参数:lussy 20
#include <iostream>
class Person {
public:
std::string p_name;
int p_age;
// 重载构造函数,并将传入的参数赋给成员变量
Person(const std::string& name, const int& age) {
p_name = name;
p_age = age;
std::cout << "成员变量:" << p_name << " " << p_age << std::endl;
std::cout << "参数:" << name << " " << age << std::endl;
}
};
int main() {
std::string str = "lussy";
int num = 20;
Person jack(str, num); // 创建Person对象,并调用重载构造函数
return 0;
}
---------
成员变量:lussy 20
参数:lussy 20
析构函数是一种特殊的成员函数,用于在对象的生命周期结束时进行清理工作。它具有与类名相同的名称,但前面有一个波浪号(~),并且不返回任何值,也没有参数。
析构函数的特性:
- 自动调用:当对象的生命周期结束时,析构函数会自动被调用
- 清理资源:析构函数用于释放对象所占用的资源,如动态分配的内存、文件句柄、网络连接等
- 没有返回值:析构函数不返回任何值,也不返回void
- 不能重载:每个类只能有一个析构函数
#include <iostream>
class Resource {
public:
// 构造函数
Resource() {
std::cout << "Resource acquired." << std::endl;
}
// 析构函数
~Resource() {
std::cout << "Resource released." << std::endl;
}
};
int main() {
Resource res;
return 0;
}
---------
Resource acquired.
Resource released.
对象的生命周期示例:
int main() {
{
Resource res; // 调用Resource的构造函数
// ...
} // res的生命周期结束,调用析构函数
Person p("Alice", 30); // 调用Person的构造函数
// ...
return 0; // p的生命周期结束,调用析构函数
}
在这个示例中,当Resource的对象res被创建时,构造函数被调用,当res离开作用域时,析构函数被调用以释放资源。同样,当Person的对象p被创建时,构造函数被调用,程序结束时,析构函数被调用。
注意:
- 构造函数和析构函数不能被继承,但它们的行为会影响派生类的对象
- 如果没有显式定义构造函数和析构函数,编译器会生成默认的构造函数和析构函数
- 构造函数可以是常量成员函数(const),但析构函数不能是常量成员函数
- 析构函数应该小心地释放对象占用的所有资源,以避免资源泄漏
推荐阅读
-
构造函数和析构函数
-
[ECMAScript 从入门到进阶教程] 第三部分:高级主题(高级函数和范例、元编程、正则表达式、性能优化)
-
Python+Matplotlib 显示通用函数、变换和函数的简单示例
-
MATLAB 计算和建模的常用函数:5.曲线拟合
-
C++ 学习笔记 ----8, 掌握类和对象 (II) ---- 更多关于成员函数的知识 (2)
-
解释 JavaScript 中函数的实参和形参
-
决策树损失函数公式的详细说明和示例图解
-
数据结构 - 创建单链表、添加、删除和检查函数,以及与结构体共用位置
-
Python 保留数据 删除 Excel 单元格 函数和公式
-
Kotlin:变量声明、空安全、条件语句、函数、类和对象