【面向对象】构造函数与析构函数详解

news/2024/11/14 23:23:45/

构造函数与析构函数详解

在这里插入图片描述



😊点此到文末惊喜↩︎

构造函数

类型

  1. 默认构造函数(缺省构造函数)
    • 一个类中只能出现一个默认构造函数
    • 在调用时,不需要传入实参。因为默认构造函数通常是无参的或所有形参都有缺省值
    • 使用默认构造函数的时候创建对象不能后面带有括号
    • 编译器自动生成non-trivial的构造函数有四种情况,其他情况就算编译器产生了默认构造函数也没有实质作用。
      • 类中有类:类A含有类B的对象作为成员,并且类B显式定义了默认构造函数,则定义类A对象的时候编译器会产生一个默认构造函数,并在这个默认构造函数中提供了调用类B构造函数的代码。
      • 类继承类:类B继承于类A,且类A显式定义了构造函数,那么在生成类B对象的过程中编译器同样会产生一个默认构造函数,在这个构造函数中提供调用基类A构造函数的代码
      • 含虚函数类:某个类含有虚函数,那么编译器会自动产生一个默认构造函数以提供虚表指针相关的初始化操作
      • 虚继承基类:一个类虚继承于其他类,那么同样的编译器会为该类产生默认的构造函数。
  2. 初始化构造函数(有参构造函数)
    • 在创建对象时,使用实参为对象的成员属性赋值,由编译器自动调用
  3. 复制 / 拷贝构造函数
    • 若没有显示定义复制构造函数,则系统会默认创建一个复制构造函数,当类中有指针成员时,由系统默认创建的复制构造函数会存在“浅拷贝”的风险,因此必须显示定义复制构造函数。
    • 复制构造函数参数为类对象本身的引用,根据调用对象进行深拷贝构建实参对象
    • 被调用的三种情况
      • 对象用于给其他对象进行赋值初始化
      • 对象作为函数形参
      • 对象作为函数返回值,实质是返回值对象作为类复制构造函数实参而调用
      //  1. 对象的赋值初始化
      Complex c2(c1);
      Complex c2 = c1;
      // 2. 函数形参
      void Function(Complex  c){...
      }// 可以使用const & :确保实参的值不会改变,并避免复制构造函数带来的深拷贝开销
      void Function(const Complex & c){}
      //3. 函数返回值
      Complex Func() {Complex  a(4);return a;
      }
      
  4. 移动构造函数
    • 临时对象转移内存所属权时调用,使用右值引用作为参数。
    	class Integer {private:int* m_ptr;public:Integer(Integer&& source)// 注意形参是右值引用: m_ptr(source.m_ptr) {source.m_ptr= nullptr;cout << "Call Integer(Integer&& source)移动" << endl;}};int main(int argc, char const* argv[]) {Integer a;Integer b(std::move(a));// 将a转换成右值引用return 0;}
    
  5. 委托构造函数
    • 构造函数可以在同一个类中一个构造函数调用另一个构造函数,从而达到简化代码的目的。
    #include <iostream>
    class Base 
    {
    public:int value1;int value2;Base()    //目标构造函数{value1 = 1;}Base(int value) : Base()  //委托构造函数{ // 委托 Base() 构造函数value2 = value;}
    };
    void EntrustedConstruction()
    {Base b(2);  //首先调用Base(int value) : Base() 毫无疑问//然后会走到base()中,先给value1复制,然后走到Base(int value) : Base() ,给value2赋值std::cout << b.value1 << std::endl;std::cout << b.value2 << std::endl;
    }
  6. 转换构造函数
    • 只有一个参数的构造函数,而且该参数又不是本类的const引用
    	#include <iostream>
    using namespace std;class Student{
    public://1. 默认构造函数,没有参数或形参具有缺省值Student(int i=2){this->age = 20;this->num = 1000;};  // 2. 初始化构造函数,有参数和参数列表Student(int a, int n):age(a), num(n){};// 3. 拷贝构造函数,参数是对象Student(const Student& s){this->age = s.age;this->num = s.num;};// 4. 移动构造函数,参数是右值引用Student(const Student&& s){this->age = s.age;this->num = s.num;}; // 3. 转换构造函数,形参是其他类型变量,且只有一个形参Student(int r){   //this->age = r;this->num = 1002;};~Student(){}
    public:int age;int num;
    };
    


少年,我观你骨骼清奇,颖悟绝伦,必成人中龙凤。
秘籍(点击图中书籍)·有缘·赠予你


🚩点此跳转到首行↩︎

参考博客

  1. C++构造函数之默认构造函数
  2. C++默认构造函数——深入理解
  3. 对C++默认构造函数的一点重要说明
  4. 拷贝构造函数
  5. 委托构造函数详解,小白也可以看懂
  6. 待定引用
  7. 待定引用
  8. 待定引用

http://www.ppmy.cn/news/21343.html

相关文章

【Node.js实战】一文带你开发博客项目之Express重构(博客的增删查改、morgan写日志)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

BIMCC4.0数仓基本概念

基本概念 文章目录基本概念基本思维数据对象字段视图关联关系验证行为事件表单字段字典基本思维 数据化思维:一切皆数据&#xff0c;包括对象、字段、视图、行为、事件&#xff0c;都是数据&#xff0c;这是信息化系统的基础抽象思维: 数据化了它就不再是实体&#xff0c;它是…

LeetCode刷题系列 -- 1080. 根到叶路径上的不足节点

给定一棵二叉树的根 root&#xff0c;请你考虑它所有 从根到叶的路径&#xff1a;从根到任何叶的路径。&#xff08;所谓一个叶子节点&#xff0c;就是一个没有子节点的节点&#xff09;假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit&#xff…

运动耳机有必要买吗、口碑最好的运动耳机品牌排行

冬天绝对是个减肥的好季节&#xff0c;因为这个季节天气比较冷&#xff0c;我们在运动过程中消耗的热量也就会更多&#xff0c;因此选择一款不错的运动耳机来用坚持就显得尤为重要了。这款运动耳机要能稳定在耳朵上&#xff0c;还要具备防水功能&#xff0c;同时音质上也要有保…

Qt StyleSheet介绍

文章目录前言纠错技巧可以使用 , 号来同时指明多个同一类型控件的样式表qss注释前言 本文主要以这篇博客为基础。添加一些自己使用的心得和使用样式表的一些技巧 纠错 ID选择器这里类型选择器可以省略&#xff0c;因为每个控件的objectName是不一样的&#xff0c;所以无需指定…

(02)Cartographer源码无死角解析-(53) 2D后端优化→位姿图优化理论讲解、

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

算法leetcode|34. 在排序数组中查找元素的第一个和最后一个位置(rust重拳出击)

文章目录34. 在排序数组中查找元素的第一个和最后一个位置&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a;分析&#xff1a;题解&#xff1a;rustgoccpythonjava34. 在排序数组中查找元素的第一个和最后一个位置&#xff1a; 给你一个按…

【vue2】vuex基础与五大配置项

&#x1f973;博 主&#xff1a;初映CY的前说(前端领域) &#x1f31e;个人信条&#xff1a;想要变成得到&#xff0c;中间还有做到&#xff01; &#x1f918;本文核心&#xff1a;vuex基础认识、state、getters、mutations actions、modules使用 目录(文末原素材) 一、…