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日

相关文章

  • opencvsharp使用ssim指数衡量图片相似度

    OpenCvSharp使用SSIM指数衡量图片相似度 OpenCvSharp是一个基于OpenCV的C#封装库,它提供了许多图像处理和计算机视觉。其中,SSIM(结构似性)指数是一种用于衡量两幅图像相似度的指标。以下是关于OpenCvSharp使用SSIM指数衡量图片相似度的完整攻略: 1. SSIM指数简介 SSIM指数是一种用于衡量两幅图像相似度的指标,…

    other 2023年5月7日
    00
  • 安装genymotionandroid模拟器

    安装Genymotion Android模拟器 Android模拟器是移动开发人员不可或缺的工具之一,能够模拟各种不同的Android设备和版本。其中,Genymotion是一款广受欢迎的Android模拟器,它提供了更好的性能和更多功能选项。本文将介绍如何安装Genymotion Android模拟器。 准备工作 在安装Genymotion之前,需要安装以…

    其他 2023年3月28日
    00
  • Sql 批量查看字符所在的表及字段

    SQL 批量查看字符所在的表及字段,涉及到字符所在的表及字段的查找,我们可以通过如下的步骤来实现: 使用information_schema系统表查询字符所在的表及字段名 构造动态 SQL 语句,实现具体功能 下面具体讲解如何通过以上步骤来实现 SQL 批量查看字符所在的表及字段的功能。 步骤1:使用information_schema系统表查询字符所在的表…

    other 2023年6月25日
    00
  • 红米手机如何关闭开发者模式?红米手机关闭开发者模式教程

    红米手机如何关闭开发者模式? 在红米手机中,关闭开发者模式非常简单,只需按照以下步骤进行操作即可。 步骤一:进入设置页面 首先,我们需要进入红米手机的设置页面。可以通过在桌面上点击“设置”图标来打开设置页面。 步骤二:进入开发者选项 在设置页面中向下滚动,找到“关于手机”或“系统”选项。然后,在“关于手机”或“系统”页面中向下滚动,找到“MIUI版本号”选项…

    other 2023年6月26日
    00
  • pc加载更多功能和移动端下拉刷新加载数据

    为了方便阅读,本文将分为两个部分,分别讲解PC端的加载更多功能和移动端的下拉刷新加载数据。 PC加载更多功能 HTML结构 首先,我们需要搭建一个基本的HTML结构,如下所示: <div id="list"> <ul> <!– 列表内容 –> </ul> <div id=&quot…

    other 2023年6月25日
    00
  • Flex布局做出自适应页面(语法和案例)

    Flex布局做出自适应页面攻略 Flex布局是一种强大的CSS布局模型,可以帮助我们创建自适应页面。在本攻略中,我将详细介绍Flex布局的语法和提供两个示例说明。 语法 要使用Flex布局,我们需要在父容器上应用display: flex属性。这将把父容器转换为Flex容器,并启用Flex布局。 Flex容器属性 以下是一些常用的Flex容器属性: flex…

    other 2023年9月6日
    00
  • Windows Server 2012的配置与部署

    Windows Server 2012的配置与部署的完整攻略 本文将为您提供Windows Server 2012的配置与部署的完整攻略,包括介绍、方法和两个示例说明。 介绍 Windows Server 2012是微软推出的一款服务器操作系统,具有高度的可靠性、安全性和可扩展性。在使用Windows Server 2012时,需要进行配置和部署,以满足不同…

    other 2023年5月6日
    00
  • 微信小程序中promise的使用

    微信小程序中Promise的使用 在微信小程序的开发过程中,如果需要进行异步操作,就需要使用到Promise。Promise是ES6中新增的特性,它可以让异步操作更加优雅。 Promise的基本使用 Promise有三种状态:pending(进行中)、resolved(已成功)、rejected(已失败)。在使用Promise时,我们需要用到then()和c…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部