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

yizhihongxing

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日

相关文章

  • androideasybarrage实现轻量级弹幕效果

    AndroidEasyBarrage实现轻量级弹幕效果 AndroidEasyBarrage是一款轻量级的弹幕效果库,它可以帮助开发者快速实现弹幕效果。在本文中,我们将详细讲解AndroidEasyBarrage使用方法,包括两个示例说明。 步骤 添加依赖 在使用AndroidEasyBarrage之前,需要在项目中添加依赖。可以在项目的build.grad…

    other 2023年5月8日
    00
  • 魔兽世界9.0法夜圣所指挥台在哪 法夜圣所指挥台位置坐标

    魔兽世界9.0法夜圣所是新资料片“影之哀伤”中新增的副本,该副本中有一处重要的位置——指挥台。以下是“魔兽世界9.0法夜圣所指挥台在哪 法夜圣所指挥台位置坐标”的完整攻略。 1. 到达法夜圣所 首先,我们需要前往法夜圣所。法夜圣所位于达纳苏斯的右下方海域,可以通过传送门和飞行点到达。进入法夜圣所后,我们需要找到指挥台所在的位置。 2. 寻找指挥台 指挥台位于…

    other 2023年6月27日
    00
  • Win10 RTM开发者入门全球直播 8月12日13日每晚23:00请锁定Channel 9

    Win10 RTM开发者入门全球直播攻略 1. 确认参与方式 Win10 RTM开发者入门全球直播是通过微软开发者社区的Channel 9平台进行直播的。参与直播需要先注册Channel 9账号,然后在直播开始前到该平台观看。 2. 确认直播时间 Win10 RTM开发者入门全球直播将在8月12日和13日每晚23:00进行两次直播,全球开放观看。 3. 注册…

    other 2023年6月26日
    00
  • vue的重点8:slice()、splice()、split()、join()详解

    在Vue中,slice()、splice()、split()、join()是常用的数组和字符串方法。下面是这些方法的详细攻略: slice() slice()方法用于从数组中提取指定的元素。它不会修改原始数组,而是返回一个新的数组,包含从开始到结束(不包括结束)的元素。下面是一个示例: const fruits = [‘apple’, ‘banana’, ‘…

    other 2023年5月8日
    00
  • fcrackzip官网

    当然,我很乐意为您提供有关“fcrackzip官网”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是fcrackzip? fcrackzip是一个用于破解加密的ZIP文件的命令行工具。它可以使用暴力破解或字典攻击的方式来破解ZIP文件的密码。 2. fcrackzip官网 fcrackzip的官方网站是http://oldhome.schmorp.de…

    other 2023年5月6日
    00
  • SpringBoot详细讲解如何创建及刷新Spring容器bean

    以下是使用标准的Markdown格式文本,详细讲解如何创建及刷新Spring容器bean的完整攻略: SpringBoot详细讲解如何创建及刷新Spring容器bean 1. 创建Spring容器 在Spring Boot中,可以通过使用@SpringBootApplication注解的主类来创建Spring容器。示例代码如下: @SpringBootApp…

    other 2023年10月15日
    00
  • Android 如何修改APK的默认名称

    Android 如何修改APK的默认名称 在Android开发中,生成的APK文件默认会使用应用的包名作为文件名。但是,您可以通过修改配置来自定义APK的默认名称。以下是完整的攻略: 步骤1:修改build.gradle文件 在您的Android项目中,找到build.gradle文件。该文件位于项目的根目录下的app文件夹中。在build.gradle文件…

    other 2023年10月13日
    00
  • js编码、解码

    以下是关于“JavaScript编码、解码”的完整攻略,包括基本概念、步骤和两个示例。 基本概念 在JavaScript中,编码和解码是指将字符串转换为URL安全的格式或将URL安全的格式转换为字符串的过程。编码通常用于将字符串作为URL参数发送到服务器,而解码则用于从服务器接收URL参数并将其转换为JavaScript中的字符串。 步骤 以下是在JavaS…

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