【c++基础】——构造函数、析构函数以及拷贝构造

写在前面:
简单的说:一个对象出生的时候,使用构造函数,死掉的时候,使用析构函数

构造函数 和 析构函数 各有各的用途,在构造函数中,我们来获取资源;在析构函数中,我们来释放资源。释放了之后,这些资源就会被回收,可以被重新利用。
在构造函数里,我们去连接数据库的连接,在析构函数里关闭数据库的连接。
在构造函数里动态的分配内存,那么在析构函数里把动态分配的内存回收。

简单区分:

特点构造函数析构函数
对应对象的阶段出生死亡
主要直观区别获取资源(动态内存,连接等)释放资源(动态内存,连接等)
作用建立标识符、开辟内存、 数据成员的初始化对象撤销是的清理作用
特点(1)与类名通名字比如Point();(2)无返回类型以及返回值;(3)不能被显式调用;(4)对象被创建时自动执行(1)类名同名~Point(),但是要在前面加一个~;(2)可以被显式的调用, 以释放对象中动态申请的内存

构造函数

  • 概念:类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行

  • 作用:
    ■ 给创建的对象建立一个标识符;
    ■ 为对象数据成员开辟内存空间;
    ■ 完成对象数据成员的初始化

  • 默认构造函数
    当用户没有显式的去定义构造函数时, 编译器会为类生成一个默认的构造函数, 称为 “默认构造函数”, 默认构造函数不能完成对象数据成员的初始化, 只能给对象创建一标识符, 并为对象中的数据成员开辟一定的内存空间。也就是少了上面三个作用中的最后一个作用初始化!

  • 特点:
    无论是用户自定义的构造函数还是默认构造函数都主要有以下特点:
    ①. 在对象被创建时自动执行;
    ②. 构造函数的函数名与类名相同;
    ③. 没有返回值类型、也没有返回值;
    ④. 构造函数不能被显式调用。

  • 显示构造函数:
    我们需要显式定义一个构造函数来覆盖掉默认构造函数以便来完成必要的初始化工作, 当用户自定义构造函数后编译器就不会再为对象生成默认构造函数

  • 有参数的构造函数:
    有时候在创建时每个对象的属性有可能是不同的, 这种直接赋值的方式显然不合适。不过构造函数是支持向函数中传入参数的, 所以可以使用带参数的构造函数来解决该问题

  • 构造函数的重载
    构造函数也毕竟是函数, 与普通函数相同, 构造函数也支持重载, 需要注意的是, 在进行构造函数的重载时要注意重载和参数默认的关系要处理好, 避免产生代码的二义性导致编译出错

  • 初始化表达式
    对象中的一些数据成员除了在构造函数体中进行初始化外还可以通过调用初始化表来进行完成, 要使用初始化表来对数据成员进行初始化时使用 : 号进行调出, 示例如下:

      Point(int x = 0, int y = 0):xPos(x), yPos(y)  //使用初始化表
      {
          cout<<"调用初始化表对数据成员进行初始化!\n";
      }
    

    在 Point 构造函数头的后面, 通过单个冒号 : 引出的就是初始化表, 初始化的内容为 Point 类中int型的 xPos 成员和 yPos成员, 其效果和 xPos = x; yPos = y; 是相同的。

    与在构造函数体内进行初始化不同的是, 使用初始化表进行初始化是在构造函数被调用以前就完成的。每个成员在初始化表中只能出现一次, 并且初始化的顺序不是取决于数据成员在初始化表中出现的顺序, 而是取决于在类中声明的顺序。

    此外, 一些通过构造函数无法进行初始化的数据类型可以使用初始化表进行初始化, 如: 常量成员和引用成员, 这部分内容将在后面进行详细说明。使用初始化表对对象成员进行初始化的完整示例:

https://www.cnblogs.com/mr-wid/archive/2013/02/19/2917911.html
https://blog.csdn.net/github_35160620/article/details/52602332

析构函数

  • 概念:类的一种特殊的成员函数,它会在每次删除所创建的对象时执行
    与构造函数相反, 析构函数是在对象被撤销时被自动调用, 用于对成员撤销时的一些清理工作, 例如在前面提到的手动释放使用 new 或 malloc 进行申请的内存空间

  • 特点:
    ■ 析构函数函数名与类名相同, 紧贴在名称前面用波浪号 ~ 与构造函数进行区分, 例如: ~Point();
    ■ 构造函数没有返回类型, 也不能指定参数, 因此析构函数只能有一个, 不能被重载;
    ■ 当对象被撤销时析构函数被自动调用, 与构造函数不同的是, 析构函数可以被显式的调用, 以释放对象中动态申请的内存。

  • 默认析构函数
    当用户没有显式定义析构函数时, 编译器同样会为对象生成一个默认的析构函数, 但默认生成的析构函数只能释放类的普通数据成员所占用的空间, 无法释放通过 new 或 malloc 进行申请的空间, 因此有时我们需要自己显式的定义析构函数对这些申请的空间进行释放, 避免造成内存泄露。

拷贝构造——暂时不太明白!

  • 就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。

  • 概念:拷贝构造函数是一种特殊的构造函数,它在创建对象时,是显示或隐式样的使用同一类中之前创建的对象来初始化新创建的对象

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

  • 如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。

还可以参考这个:https://blog.csdn.net/wenqiang1208/article/details/52851633讲的也不错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值