首页 > 编程语言 >C++构造函数和析构函数

C++构造函数和析构函数

时间:2024-12-12 22:02:30浏览次数:6  
标签:include 函数 int C++ 析构 MyClass 和析构 构造函数

目录

1构造函数

1.1什么是构造函数?

1.2无参构造函数

1.3带参数构造函数

2析构函数

2.1什么是析构函数?


1构造函数

1.1什么是构造函数?

类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。
构造,那构造的是什么呢?
构造成员变量的初始化值,内存空间等
构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。(和python中的__init__类似)

1.2无参构造函数

下面的实例有助于更好地理解构造函数的概念:

#include <iostream>
#include <string>
using namespace std;  // 使用std命名空间

class Car {
    public:
    string brand;  // 不需要使用std::string
    int year;
    // 无参构造函数
    Car() {
        brand = "未知";
        year = 0;
        cout << "无参构造函数被调用" << endl;  // 不需要使用std::cout和std::endl
    }
    void display() {
        cout << "Brand: " << brand << ", Year: " << year << endl;
    }
};

int main() {
    Car myCar; // 创建Car对象
    myCar.display(); // 显示车辆信息
    return 0;
}

1.3带参数构造函数

默认的构造函数没有任何参数,但如果需要,构造函数也可以带有参数。这样在创建对象时就会给对象赋初始值,如下面的例子所示:

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

class Car {
public:
    string brand;
    int year;
    // 带参数的构造函数,使用常规的赋值方式
    Car(string b, int y) {
        brand = b;
        year = y;
    }
    void display() {
        cout << "Brand: " << brand << ", Year: " << year << endl;
    }
};

int main() {
    Car myCar("Toyota", 2020); // 使用带参数的构造函数创建Car对象
    myCar.display(); // 显示车辆信息
    return 0;
}

2析构函数

2.1什么是析构函数?

析构函数是C++中的一个特殊的成员函数,它在对象生命周期结束时被自动调用,用于执行对象销毁前的清理工作。析构函数特别重要,尤其是在涉及动态分配的资源(如内存、文件句柄、网络连接等)的情况下。(和python中__del__类似)
基本特性
1. 名称:析构函数的名称由波浪号( ~ )后跟类名构成,如  ~MyClass() 。
2. 无返回值和参数:析构函数不接受任何参数,也不返回任何值。
3. 自动调用:当对象的生命周期结束时(例如,一个局部对象的作用域结束,或者使用  delete 删除一个动态分配的对象),析构函数会被自动调用。
4. 不可重载:每个类只能有一个析构函数。
5. 继承和多态:如果一个类是多态基类,其析构函数应该是虚的。

假设我们有一个类  MyClass ,它包含了动态分配的内存或其他资源:

#include <iostream>
using namespace std;
class MyClass{
private:
    int* datas;
public:
    MyClass(int size){
        datas = new int[size];
    }

    ~MyClass(){
    cout << "析构函数被调用" << endl;
        delete[] datas;
    }
};

int main()
{
    MyClass m1(5);
    MyClass *m2 = new MyClass(10);
    delete m2;
    return 0;
}

在这个示例中, MyClass 的构造函数分配了一块内存,而析构函数释放了这块内存。当  obj 的生命周期结束时(即离开了它的作用域), MyClass 的析构函数被自动调用,负责清理资源,防止内存泄露。

重要性:析构函数在管理资源方面非常重要。没有正确实现析构函数,可能导致资源泄露或其他问题。在基于RAII(资源获取即初始化)原则的C++编程实践中,确保资源在对象析构时被适当释放是非常关键的。当使用智能指针和其他自动资源管理技术时,可以减少显式编写析构函数的需要,但了解析构函数的工作原理仍然很重要。

标签:include,函数,int,C++,析构,MyClass,和析构,构造函数
From: https://blog.csdn.net/qq_42268998/article/details/144436552

相关文章

  • 12C++循环结构-for循环(2)——教学
    一、循环变量为字符型试编一程序,按字典顺序输出26个字母。流程图:思考:先顺序输出26个小写英文字母,再逆序输出26个大写英文字母。循环可以是递增型循环,也可以是递减型循环。二、打擂台-for语句的另一种形式问题:试编一程序,输入10个数,输出其中最大的数。以前学过,输入三个数求......
  • C++ debug
    C++debug在C++中,查看程序的调用栈(CallStack)通常用于调试崩溃、性能问题或逻辑错误等场景。以下是几种常用的方法来查看调用栈:1.使用GDB调试器查看调用栈GDB(GNUDebugger)是Linux上非常流行的调试工具,可以用来查看C++程序的调用栈。示例:假设有以下C++程序:#includ......
  • [C++] 继承详解
    目录前言演示用编译器及其标准DevC++6.7.5Redpanda C++14                           先 赞 后 看  养  成 习 惯  正文1、继承的概念与意义2、继承的使用 2.1继承的定义及语法2......
  • C++_运算符重载
    filesystemc++11在CMakeList.txtfind_package(BoostCOMPONENTSsystemfilesystemregexREQUIRED)include_directories(${Boost_INCLUDE_DIRS})target_link_libraries(projectname${Boost_LIBRARIES})程序#include<boost/filesystem.hpp>......
  • C++ Boost库 tuple元组
    元组boost::tuple是Boost库中提供的允许程序员创建固定大小的元组,这些元组可以包含不同类型的元素。元组是一个数据结构,它可以存储多个值,这些值可以是不同类型的。boost::tuple是C++标准库中std::tuple的前身,后者在C++11标准中被引入。特点固定大小:一旦创建,boost::tuple的大小......
  • C++11 lock_guard和unique_lock
    一、RAII技术1、ResourceAcquisitionIsInitialization,资源获取即初始化,由C++之父提出。2、使用局部对象来管理资源的技术,称为资源获取即初始化。3、资源主要指操作系统中有限的东西,如内存、套接字等;局部对象指存储在栈里的对象,生命周期由操作系统来管理。4、资源......
  • C++学习笔记 数组
    1.一维数组1.1数组的定义数组的定义方式和变量类似。#include<iostream>#include<algorithm>usingnamespacestd;intmain(){inta[10],b[10];floatf[33];doubled[123];charc[21];return0;}1.2数组的初始化在main函数内部,未初......
  • C++ 的发展
    目录​编辑C++的发展总结:​编辑1. C++的早期发展(1979-1985)2. C++标准化过程(1985-1998)3. C++标准演化(2003-2011)4. C++11(2011年)5. C++14(2014年)6. C++17(2017年)7. C++20(2020年)8. C++23(2023年)1. C++1985:C++1.0主要特性:示例代码:代码讲解:C++1.0的局......
  • 在CodeBolcks+wxWidgets+wxSmith下的C++编程教程——用向导创建一个wxWidgets项目(sTet
    0.前言我想通过编写一个完整的游戏程序方式引导读者体验程序设计的全过程。我将采用多种方式编写具有相同效果的应用程序,并通过不同方式形成的代码和实现方法的对比来理解程序开发更深层的知识。了解我编写教程的思路,请参阅体现我最初想法的那篇文章中的“1.编程计划”:学习编程......
  • 23. C++STL 9 (priority_queue的使用和适配实现详解)
    ⭐本篇重点:1priority_queue的使用与底层原理2使用容器来适配priority_queue⭐本篇代码:c++学习·橘子真甜/c++-learning-of-yzc-码云-开源中国(gitee.com)⭐标⭐是比较重要的部分目录一.priority_queue(优先级队列)的使用与原理1.1priority_queue的底层原理......