【C++】C++构造函数与析构函数
文章目录
- 构造函数
- 构造函数概述
- 复制构造函数
- 析构函数
构造函数
构造函数概述
当类的实例进入其作用域,也就是建立一个对象时,就会调用构造函数。
那么,构造函数的作用是什么呢?当建立一个对象时,常常需要做某些初始化工作,例如,对数据成员赋值,设置类的属性等,而这些操作刚好在构造函数中完成。
定义:构造函数是与类同名的特殊成员函数,没有返回值(包括void)。
调用:构造函数在创建对象时自动调用,不能被显式调用。
重载:可以定义多个构造函数(构造函数重载),以支持不同的初始化方式。
默认构造函数:
不带参数的构造函数。
如果没有定义任何构造函数,编译器会自动提供一个默认构造函数。
示例:
class Point
{
public:
Point()
{ // 默认构造函数
x = 0;
y = 0;
}
int x, y;
};
带参数的构造函数:
接受参数以初始化对象的属性。
示例:
class Point
{
public:
Point(int xVal, int yVal)
{ // 带参数的构造函数
x = xVal;
y = yVal;
}
int x, y;
};
复制构造函数
在开发程序时可能需要保存对象的副本,以便在后面执行的过程中恢复对象的状态。那么,如何使用已经初始化的对象来生成一个一模一样的对象呢?答案是使用复制构造函数来实现。复制构造函数的参数是一个已经初始化的类对象。
使用复制构造函数,代码如下:
#include < iostream >
#include "Person.h"
using namespace std;
int main()
{
CPerson p1(20, 30, 100);
CPerson p2(p1);
}
程序中先使用带参数的构造函数声明对象p1,然后通过复制构造函数声明对象p2。因为p1已经是初始化完成的类对象,所以它可以作为复制构造函数的参数。
析构函数
构造函数和析构函数是类体定义中比较特殊的两个成员函数,因为它们都没有返回值,而且构造函数名标识符和类名标识符相同,析构函数名标识符就是在类名标识符的前面加上“~”符号。
构造函数主要用来在创建对象时,给对象中的一些数据成员赋值,目的就是初始化对象。析构函数是用来释放对象的,在删除对象前,用它来做一些清理工作。析构函数的功能与构造函数的功能正好相反。
#include <iostream>
#include <cstring>
class Student
{
public:
// 默认构造函数
Student(const char *name, int age)
{
// 动态分配内存并复制字符串
this->name = new char[strlen(name) + 1];
strcpy(this->name, name);
this->age = age;
}
// 析构函数
~Student()
{
std::cout << "Destructor called for: " << name << std::endl;
delete[] name; // 释放动态分配的内存
}
// 显示学生信息
void display() const
{
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
private:
char *name; // 动态分配的字符串
int age;
};
int main()
{
{
Student student1("Alice", 20); // 创建一个对象
student1.display(); // 输出: Name: Alice, Age: 20
} // student1的作用域结束,析构函数会被调用
{
Student student2("Bob", 22); // 创建另一个对象
student2.display(); // 输出: Name: Bob, Age: 22
} // student2的作用域结束,析构函数会被调用
return 0;
}
使用析构函数的注意事项如下:
在一个类中只可能定义一个析构函数。
析构函数不能重载。
构造函数和析构函数不能使用return语句返回值。不用加上关键字void。
构造函数和析构函数的调用环境如下:
(1)自动变量的作用域是某个模块,当此模块被激活时,自动变量调用构造函数;当退出此模块时,会调用析构函数。
(2)全局变量在进入main()函数之前会调用构造函数,在程序终止时会调用析构函数。
(3)动态分配的对象使用new为对象分配内存时会调用构造函数;使用delete删除对象时会调用析构函数。
(4)临时变量是为了支持计算,由编译器自动产生的。在临时变量生存期的开始和结尾会调用构造函数与析构函数。