C++中构造函数与析构函数的详解及其作用介绍

 更新时间:2021年09月07日 14:34:09   作者:我是小白呀  
这篇文章主要介绍了C++中构造函数与析构函数的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

构造函数

构造函数 (constructor) 是一种特殊的成员函数. 它会在每次创建类的新对象时执行. 构造函数的名称与类的名称是完全相同的, 并且不会返回任何类型. 构造函数可用于为某些成员变量设置初始值.

在这里插入图片描述

格式:

Class::Class(); // 构造函数

默认构造函数

如果用户自己没有定义构造函数, C++ 系统会自动生成一个默认构造函数. 这个构造函数体是空的, 没有参数, 不执行初始化操作.

例如:

Time.h:

class Time {
private:
    int hour;
    int minute;
    int second;
public:
    Time(); // 默认构造函数
    void set_time(int h, int m, int s);
    void show_time();
};

Time.cpp:

#include "Time.h"
#include <iostream>

using namespace std;

Time::Time() {
    hour = 0;
    minute = 0;
    second = 0;
}

void Time::set_time(int h, int m, int s) {
    hour = h;
    minute = m;
    second = s;
}

void Time::show_time() {
    cout << hour << ":" << minute << ":" << second << endl;
}

main:

#include "Time.h"
#include <iostream>

using namespace std;

int main() {

    Time time1;  // 实例化time
    time1.show_time();  // 调用show_time

    return 0;
}

输出结果:

0:0:0

重点:

  • 即使提供了其他构造函数, 提供一个默认构造函数几乎总是对的
  • 通常在默认构造函数中, 给成员提供的初始值应该指出该对象是 “空” 的

有参构造函数

构造函数中参数可以指定默认值. 如果童虎不指定实参指, 编译西永就使形参取默认值.

例如:

Time 类:

#ifndef PROJECT1_TIME_H
#define PROJECT1_TIME_H

class Time {
private:
    int hour;
    int minute;
    int second;
public:
    Time();  // 默认构造函数
    Time(int h, int m=0, int s=0);  // 有参构造函数
    void show_time();
};

#endif //PROJECT1_TIME_H

Time.cpp:

#include "Time.h"
#include <iostream>
using namespace std;

// 默认构造函数
Time::Time() : hour(0), minute(0), second(0) {}

// 有参构造函数
Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}


void Time::show_time() {
    cout << hour << ":" << minute << ":" << second << endl;
}

main:

#include "Time.h"
#include <iostream>
using namespace std;

int main() {

    Time time1;
    time1.show_time();

    Time time2(8);
    time2.show_time();

    Time time3(8, 8);
    time3.show_time();
    
    Time time4(8, 8, 8);
    time4.show_time();

    return 0;
}

输出结果:

0:0:0
8:0:0
8:8:0
8:8:8

析构函数

析构函数 (destructor) 也是一个特殊的成员函数. 当对象的生命期结束时, 会自动执行析构函数. 析构函数的名字是类名前面加一个 “~” 符号.

在这里插入图片描述

格式:

Class::~Class();  // 析构函数

析构函数的作用在撤销对象占用的内存之前完成一些清理 & 善后的工作.

析构函数例子

Student 类:

#ifndef PROJECT1_STUDENT_H
#define PROJECT1_STUDENT_H

#include <string>
using namespace std;

class Student {
private:
    int num;
    string name;
    char gender;
public:
    Student();
    Student(int num, string name, char gender);
    ~Student();
    void display();
};

#endif //PROJECT1_STUDENT_H

Student.cpp:

#include "Student.h"
#include <iostream>
using namespace std;

// 无参构造
Student::Student() : num(-1), name("None"), gender('N') {}

Student::Student(int n, string p, char g) : num(n), name(p), gender(g) {
    cout << "执行构造函数: " << "Welcome, " << name << endl;
}

void Student::display() {
    cout << "num: " << num << endl;
    cout << "name: " << name << endl;
    cout << "gender: " << gender << endl;
    cout << "===============" << endl;
}

Student::~Student() {
    cout << "执行析构函数: " << "Bye bye, " << name << endl;
}

main:

#include "Student.h"
#include <iostream>
using namespace std;

int main() {

    Student student1(1, "Little white", 'f');
    Student student2(2, "Big white", 'f');

    student1.display();
    student2.display();

    return 0;
}

输出结果:

执行构造函数: Welcome, Little white
执行构造函数: Welcome, Big white
num: 1
name: Little white
gender: f
===============
num: 2
name: Big white
gender: f
===============
执行析构函数: Bye bye, Big white
执行析构函数: Bye bye, Little white

析构函数执行时机

对于函数中定义的自动局部对象, 当函数被调用结束时, 对象释放. 在对象释放前自自动执行析构函数.

在这里插入图片描述

局部对象

static 局部对象只在 main 函数结束或调用 exit 函数结束程序时, 调用 static 局部对象的洗后函数.

全局对象

对于全局对象, 在程序的流程离开其作用域时 (如 main 函数结束或调用 exit 函数) 时, 调用该全局对象的析构函数.

到此这篇关于C++中构造函数与析构函数的详解及其作用介绍的文章就介绍到这了,更多相关C++ 构造函数 析构函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言联合体的实现示例

    C语言联合体的实现示例

    C语言联合体是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • C语言指针基础详解

    C语言指针基础详解

    这篇文章主要介绍了C语言指针的基础,主要对C语言中指针的本质及常见用法做了较为通俗易懂的分析,是后续深入学习C语言的基础,需要的朋友可以参考下
    2021-10-10
  • 从汇编看c++中默认构造函数的使用分析

    从汇编看c++中默认构造函数的使用分析

    c++中,如果为一个类没有明确定义一个构造函数,那么,编译器就会自动合成一个默认的构造函数。下面,通过汇编程序,来看一下其真实情况
    2013-05-05
  • C++泛型编程基本概念详解

    C++泛型编程基本概念详解

    这一篇介绍一下 C++ 编程中与面向对象并列的另一大分支——泛型编程,这一篇主要介绍函数模板、类模板和成员模板三大部分,需要的朋友可以参考下
    2021-08-08
  • C/C++中带空格字符串的输入讲解

    C/C++中带空格字符串的输入讲解

    这篇文章主要给大家介绍了关于如何解决C++中带空格字符串的输入问题,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2021-09-09
  • C++11之后的decltype类型指示符详解

    C++11之后的decltype类型指示符详解

    为了满足这一要求,C++11 新标准引入了另一种类型说明符 decltype ,它的作用是选择并返回操作数的数据类型,这篇文章主要介绍了C++11之后的decltype类型指示符,需要的朋友可以参考下
    2023-01-01
  • c++代码实现tea加密算法的实例详解

    c++代码实现tea加密算法的实例详解

    这篇文章主要介绍了c++代码实现tea加密算法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C++继承介绍

    C++继承介绍

    C++继承可以是单一继承或多重继承,每一个继承连接可以是public,protected,private也可以是virtual或non-virtual
    2013-01-01
  • 详解C语言内核字符串拷贝与比较

    详解C语言内核字符串拷贝与比较

    本文将探索一下字符串的拷贝与比较,与应用层不同内核字符串拷贝与比较也需要使用内核专用的API函数,字符串的拷贝往往伴随有内核内存分配,我们将首先简单介绍内核如何分配堆空间,然后再以此为契机简介字符串的拷贝与比较
    2022-09-09
  • C++超详细梳理基础知识

    C++超详细梳理基础知识

    这篇文章主要介绍了C++基础概念,​ 本次为C++的一个开篇,重点是更好的理解C++相对于其他编程语言的一个特性,之后会持续更新,本次专栏计划是掌握C++的基础语法以及常用特性,并且从细节上去理解,需要的朋友可以参考一下
    2022-06-06

最新评论