【零基础学习C++】构造函数与析构函数

简介: 构造函数与析构函数

个人主页:【😊个人主页】
系列专栏:【❤️系列专栏】


@[toc]


前言

>期末复习笔记,感兴趣的可以收藏

构造函数与析构函数

构造函数

C++用以初始化对象的数据成员的函数

构造函数要注意的知识点:

  1. 构造函数是没有返回值类型的。
  2. 构造函数的函数名必须 与类名一致。
  3. 构造函数并不是由我们手动调用的, 构造函数是在创建对应对象的时候由jvm主动调用的(每创建一个对象就会调用一次构造函数)。
  4. 如果一个类没有显式的添加一个构造函数,那么java编译器会为该类添加一个无参的构造函数。
  5. 如果一个类已经显式的添加一个构造函数,那么java编译器则不会再为该类添加一个无参的构造函数。
  6. 构造函数是可以以函数重载的形式存在多个的。
  7. 构造类型可以设置缺省参数。
  8. 构造函数不可以对静态数据成员进行初始化
  9. 编译器总是自动创建一个不带参数的构造函数
构造函数的格式:

修饰符  函数名(形式参数列表){
    初始化的语句;
}

析构函数

析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。

构造函数要注意的知识点:

  1. 构造函数可以有多个来构成重载,但析构函数只能有一个,不能构成重载
  2. 构造函数可以有参数,但析构函数不能有参数
  3. 与构造函数相同的是,如果没有显式的写出析构函数,那么编译器也会自动加上一个析构函数,什么都不做;如果我们显式的写了析构函数,那么将会覆盖默认的析构函数
  4. 在主函数中,析构函数的执行在return语句之前,这也说明主函数结束的标志是return,return执行完后主函数也就执行完了,就算return后面还有其他的语句,也不会执行
  5. 一个类中只能定义一个析构函数
 class <类名>
{
 public:
 ~<类名>();
 };
 <类名>::~<类名>()
 {
//函数体
}

拷贝构造函数

拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。
拷贝构造函数通常用于:

  • 通过使用另一个同类型的对象来初始化新创建的对象。
  • 复制对象把它作为参数传递给函数。
  • 复制对象,并从函数返回这个对象

    拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量。
    使用场景:

    • 对象以值传递的方式传入函数参数
      • 对象以值传递的方式从函数返回
      • 对象需要通过另外一个对象进行初始

    常见形式:
    classname (const classname &obj) {
    // 构造函数的主体
    }

    深拷贝

    只要发现对象有可变类型,就会对该对象到最后一个可变类型的每一层对象进行拷贝,对每一层拷贝的对象都会开辟新的内存空间进行存储
    通常包括:
    不可变类型: 数字、字符串、元组
    对于数字和字符串,都是不可变类型,所以使用深拷贝的时候,不会开辟新的内存空间。
    元组中如果有可变类型对象,进行深拷贝后,会开辟新的内存地址。元组中如果没有可变类型对象,进行深拷贝后,不会开辟新的内存地址。
    如果发现元组里面有可变类型那么,会对元组进行拷贝和子元素列表进行拷贝,拷贝后都会产生一个新的内存空间。但是不可变类型不会进行拷贝,因为不可变类型不允许在原有内存空间的基础修改数据。所以拷贝没有意义。因为每次拷贝,内存地址都会发生变化。
    可变类型: 列表 、 字典、 集合
    对应深拷贝来说也会进行拷贝,如果发现子对象也是可变类型也会进行拷贝,拷贝后会开辟新的内存空间存储拷贝后的对象。

浅拷贝

对象复制时,只对对象中的数据成员进行简单的赋值,默认拷贝构造函数执行的也是浅拷贝。
只会对可变类型的第一层对象进行拷贝,不会对子对象进行拷贝,拷贝成功后会开辟一个新的内存空间存储拷贝这个对象
通常包括:
1.不可变类型:数字、字符串、元组
浅拷贝不会对不可变类型进行拷贝,也就是说不会开辟内存空间
2.可变类型: 列表 、字典、 集合
对于可变类型来说,浅拷贝只拷贝第一次层,不会对子对象进行拷贝,所以第一层内存地址发生了变化,但是子对象内存地址没有变化

浅拷贝和深拷贝的区别

浅拷贝最多拷贝对象的一层,深拷贝可能是拷贝对象的多层

目录
相关文章
|
3月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
75 0
|
1天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
12 4
|
16天前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
73 30
|
1月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
18 1
|
1月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
18 1
|
1月前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
16 0
|
1月前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
20 0
|
3月前
|
编译器 C++
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。 在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。 这种矛盾在C++继承中是普遍存在的,解决这个问题的思路是:在派生类的构造函数中调用基类的构造函数。 下面的例子展示了如何在派生类的构造函数中调用基类的构造函数:
|
4月前
|
C++ 运维
开发与运维函数问题之析构函数在C++类中起什么作用如何解决
开发与运维函数问题之析构函数在C++类中起什么作用如何解决
41 11