C++:构造函数,析构函数详解

C++:构造函数,析构函数详解

什么是构造函数?

构造函数是在实例化对象时自动调用的一种函数,用于初始化对象的数据成员和其他相关资源。在C++中,构造函数的名称必须与类的名称相同。

C++支持默认构造函数和带参数的构造函数。默认构造函数是没有参数的构造函数,它可以在对象创建时被调用,用于初始化默认值。带参数的构造函数允许像函数一样传递参数列表,用于根据传递的参数初始化对象的数据成员和其他资源。

构造函数的声明方式如下:

class ClassName {
public:
  ClassName(); // 默认构造函数
  ClassName(参数类型 参数1, 参数类型 参数2); // 带参数的构造函数
};

构造函数在以下情况下会被自动调用:
- 创建一个对象时
- 在数组中创建对象时
- 当一个对象是类的成员时

下面是一个示例,展示了如何定义一个简单的类和构造函数:

class Box {
  public:
    Box(); // 默认构造函数
    Box(double l, double w, double h); // 带参数的构造函数
  private:
    double length;
    double width;
    double height;
};

Box::Box() {
  length = 0;
  width = 0;
  height = 0;
}

Box::Box(double l, double w, double h) {
  length = l;
  width = w;
  height = h;
}

什么是析构函数?

析构函数是在对象被销毁时自动调用的一种函数,用于释放对象已分配的资源。与构造函数一样,析构函数的名称必须与类的名称相同,并在名称前加上一个波浪号(~)。

析构函数的声明方式如下:

class ClassName {
public:
  // 构造函数声明

  ~ClassName(); // 析构函数
};

析构函数将释放在构造函数中分配的内存,它在以下情况下自动调用:
- 当对象离开其作用域时
- 当对象通过delete运算符被释放时
- 当对象是类的成员时,且该类的成员被销毁时

下面是一个示例,展示了如何定义一个析构函数来释放所分配的内存:

class MyString {
  public:
    MyString(); // 默认构造函数
    MyString(const char* str); // 带参数的构造函数
    ~MyString(); // 析构函数
  private:
    char* str_ptr;
};

MyString::MyString() {
  str_ptr = new char[1];
  *str_ptr = '\0';
}

MyString::MyString(const char* str) {
  int len = strlen(str);
  str_ptr = new char[len + 1];
  strcpy(str_ptr, str);
}

MyString::~MyString() {
  delete[] str_ptr;
}

总结

在C++中,构造函数和析构函数是用于初始化和清理对象所需的资源的重要函数。构造函数在实例化对象时自动调用,而析构函数则在对象被销毁时自动调用。这两个函数都可带参数,因此可以对对象的数据成员进行初始化,并对其进行清理。通过正确实现这些函数,可以确保C++类正确地工作,并生成可靠的代码。

示例1

下面是一个利用构造函数初始化对象的示例代码:

#include <iostream>
using namespace std;

class Person {
public:
    Person(); // 默认构造函数
    Person(string n, int a, string s); // 带参数的构造函数
    void showInfo();
private:
    string name;
    int age;
    string sex;
};

Person::Person() {
    name = "";
    age = 0;
    sex = "";
}

Person::Person(string n, int a, string s) {
    name = n;
    age = a;
    sex = s;
}

void Person::showInfo() {
    cout << "Name: " << name << endl;
    cout << "Age: " << age << endl;
    cout << "Sex: " << sex << endl;
}

int main() {
    Person p1; // 调用默认构造函数
    p1.showInfo(); // 输出:Name:  Age: 0 Sex:

    Person p2("Tom", 20, "Male"); // 调用带参数的构造函数
    p2.showInfo(); // 输出:Name: Tom Age: 20 Sex: Male

    return 0;
}

示例2

下面是一个利用析构函数释放对象资源的示例代码:

#include <iostream>
#include <string.h>
using namespace std;

class MyString {
public:
    MyString(); // 默认构造函数
    MyString(const char* str); // 带参数的构造函数
    ~MyString(); // 析构函数
    void printStr();
private:
    char* str_ptr;
};

MyString::MyString() {
    str_ptr = new char[1];
    *str_ptr = '\0';
}

MyString::MyString(const char* str) {
    int len = strlen(str);
    str_ptr = new char[len + 1];
    strcpy(str_ptr, str);
}

MyString::~MyString() {
    delete[] str_ptr;
}

void MyString::printStr() {
    cout << "String: " << str_ptr << endl;
}

int main() {
    MyString s1; // 调用默认构造函数
    s1.printStr(); // 输出:String: 

    MyString s2("Hello, World!"); // 调用带参数的构造函数
    s2.printStr(); // 输出:String: Hello, World!

    return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++:构造函数,析构函数详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • React Fiber 链表操作及原理示例详解

    React Fiber 是 React 16 中全新的协调引擎,它可以在不阻塞渲染主线程的情况下,执行异步任务。为了实现这一目标,React Fiber 使用链表数据结构来管理组件树的遍历及操作。 React Fiber 的链表包含两个主要的节点类型:FiberNode 和 EffectNode。FiberNode 用于表示当前的组件,而 EffectNod…

    other 2023年6月27日
    00
  • 微信小程序如何监听全局变量

    count: 0 }, onShow: function () { var count = wx.getStorageSync(‘count’); this.setData({ count: count }); wx.onAppShow(function () { var count = wx.getStorageSync(‘count’); this.se…

    other 2023年7月28日
    00
  • vue中设置、获取、删除cookie的方法

    Vue中设置、获取、删除Cookie的方法 在Vue中,可以使用document.cookie来设置、获取和删除Cookie。下面是详细的攻略: 设置Cookie 要设置Cookie,可以使用document.cookie属性。Cookie是一个字符串,它由键值对组成,每个键值对之间使用分号和空格进行分隔。以下是设置Cookie的方法: // 设置Cooki…

    other 2023年7月29日
    00
  • python super()函数的详解

    Python super()函数的详解 super()函数是用于解决多重继承中父类方法名冲突的一种机制,它返回一个临时对象,这个临时对象绑定了父类和子类的关系,可以让我们很方便地调用父类的方法。 super()的语法 super([type[, object-or-type]]) type — 类。 如果是单继承,第一个参数是省略的,直接使用父类即可。 o…

    other 2023年6月27日
    00
  • uniapp实现上拉加载更多功能的全过程

    下面是“uniapp实现上拉加载更多功能的全过程”的完整攻略: 1. 前置知识 在实现上拉加载更多功能之前,需要掌握以下方面的知识: uniapp基本使用 Vue.js基本使用 uniapp生命周期函数 Vue.js计算属性 uniapp组件传值 如果您还不熟悉这些知识,可以先学习一下。 2. 实现过程 2.1 添加上拉加载更多功能 在uniapp中,可以通…

    other 2023年6月25日
    00
  • 老毛子百度云文件名批量修改器给百度网盘文件批量重命名的方法介绍(附下载)

    那么我将为大家详细讲解“老毛子百度云文件名批量修改器给百度网盘文件批量重命名的方法介绍(附下载)”的完整攻略。 什么是老毛子百度云文件名批量修改器 老毛子百度云文件名批量修改器是一款专门针对百度网盘的文件批量重命名工具,它可以帮助用户快速地对百度网盘中的文件进行批量重命名,提高工作效率。 下载老毛子百度云文件名批量修改器 首先,我们需要下载老毛子百度云文件名…

    other 2023年6月26日
    00
  • Android 侧滑按钮的实现代码

    当实现Android侧滑按钮时,可以使用以下步骤: 创建布局文件:首先,创建一个包含侧滑按钮的布局文件。可以使用RelativeLayout或ConstraintLayout作为根布局,并在其中添加一个按钮。例如,以下是一个简单的布局文件示例: <RelativeLayout xmlns:android=\"http://schemas.an…

    other 2023年9月6日
    00
  • python3.5学习笔记(第一章)

    以下是详细讲解“Python3.5学习笔记(第一章)”的完整攻略,过程中包含两个示例说明: Python3.5学习笔记(第一章) Python是一种流行的高级编程语言,具有简单易学、功能强大、可扩展性强等特点。本攻略将介绍Python3.5的基本语法、数据类型和两个示例说明。 基本语法 Python3.5的基本语法如下: # 输出Hello, World! …

    other 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部