C++分析构造函数与析造函数的特点梳理

 更新时间:2022年05月09日 11:38:17   作者:Gy648  
本文对类的构造函数和析构函数进行总结,主要包括了构造函数的初始化、重载、使用参数和默认参数,拷贝构造函数和析构函数,希望能帮助读者在程序开发中更好的理解类,属于C/C++基础

构造函数的调用

默认情况下编译器至少给一个类添加3个函数

1.默认构造函数(无参,函数体实现)--完成对象的初始化

2.默认析构函数(无参,函数体为空)--完成对象的清理

3.默认拷贝构造函数,属性进行值拷贝

规则:

如果用户定义了有参构造,c++不会提供无参构造,但是提供默认拷贝构造

如果用户定义了拷贝构造函数,c++不会在提供其他函数

类名(){}

构造函数的语法

1,没有返回值,也不写void;

2,函数名称与类名相同;

3,构造函数可以有参数,因此可以发生重载;

4,程序在调用对象时会自动调用构造函数,无需手动调用且只调用一次

析造函数~类名()

1.析造函数,没有返回值也不写void

2.函数名称与类名相同在前面加上~

3.构造函数不可以有参数,因此不可以发生重载

4.程序在对象销毁会自动调用析构,与构造函数的调用规则相同

构造函数的分类及调用

1.按照参数分类为 无参构造和 有参构造

class person
{
public:
    person()
    {
    cout<<"无参构造的调用"<<endl;
    }
    person(int a)
    {
    cout<<"有参构造的调用"<<endl;
    }
};

2.按照类型分为 普通构造和 拷贝构造

person(const person& p)
{
}

拷贝构造的语法

调用构造函数的方法

void test()
{
    //1.括号法
    person p1;//默认无参构造调用
    person p2(10);//默认有参构造的调用
     preson p3(p2);//拷贝构造的调用;
    //若是这样写 下面这行代码会被认为是编译器的声明
     person p1();  // void func();
   // 无法完成函数的调用
    2.显示法
    person p1;
    person p2=person(10);
    person p3=person(p2);
    // 匿名对象
   person(10);//特点:当前行执行结束后,系统会立即回收匿名对象
    // 3.隐式转换法
    person p4=10;// 相当于 写了 person p4 =person(10);
    person p5=p4;
}

拷贝构造的调用时机

1.使用一个已经创建完毕的对象来初始化一个新对象

2.值传递的形式给函数参数传值

class p
{
};
void dowork(person p )//形参p
{
}
void test02()
{
    person p;
    dowork(p);// 相当于发生了隐式类型转换 传入值拷贝 person p=p;
}

3.值方式返回局部对象

深拷贝与浅拷贝

如果利用编译器提供的拷贝构造函数

会做浅(值)拷贝的操作(会使得new的对象指针指向同一个地址),会带来对堆区内存持续释放的问题

如果堆区开辟了内存,可以在析构函数中释放;

对于拷贝构造函数,可以自己实现一个拷贝构造函数(深拷贝)(new一个新的对象实现拷贝构造)

总结: 如果属性有在堆区开辟,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

初始化列表

c++提供了初始化列表语法用来初始化属性

class person
{
    person(int a,int b,int c):m_a(a),m_b(b),m_c(c);
    {
    }
    int m_a;
    int m_b;
    int m_c;
};

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

相关文章

  • C语言中队列的结构和函数接口的使用示例

    C语言中队列的结构和函数接口的使用示例

    队列只允许一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO的性质;队列可用数组和链表 的方法实现,使用链表的结构实现更优一些,因为如果使用数组节,出队列时删去首元素需要将整个数组前移,效率比较低
    2023-02-02
  • C++实现stack与queue数据结构的模拟

    C++实现stack与queue数据结构的模拟

    stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作;队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素
    2023-04-04
  • gazebo里通过节点发布topic让关节转动实现详解

    gazebo里通过节点发布topic让关节转动实现详解

    这篇文章主要介绍了gazebo里通过节点发布topic让关节转动实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • C++ deque与vector对比的优缺点

    C++ deque与vector对比的优缺点

    这篇文章主要介绍了C++中deque与vector相比的优势与劣势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • C语言深入讲解函数的使用

    C语言深入讲解函数的使用

    各位小伙伴们,今天YU同学给大家带来的是与函数相关的知识,本篇将会带着大家初步认识和调用函数来解决一些简单的问题
    2022-04-04
  • C++中实现OpenCV图像分割与分水岭算法

    C++中实现OpenCV图像分割与分水岭算法

    分水岭算法是一种常用的图像区域分割法,本文主要介绍了OpenCV图像分割与分水岭算法,使用C++实现,具有一定的参考价值,感兴趣的可以了解一下
    2021-06-06
  • 分享常用的3个C++小技巧

    分享常用的3个C++小技巧

    这篇文章主要分享了常用的3个C++小技巧,
    2021-12-12
  • C语言实现自动给QQ好友发窗口抖动

    C语言实现自动给QQ好友发窗口抖动

    这篇文章主要介绍了C语言实现自动给QQ好友发窗口抖动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • C++实现AVL树的基本操作指南

    C++实现AVL树的基本操作指南

    AVL树是高度平衡的而二叉树,它的特点是AVL树中任何节点的两个子树的高度最大差别为1,下面这篇文章主要给大家介绍了关于C++实现AVL树的相关资料,需要的朋友可以参考下
    2022-01-01
  • C++删除链表中间节点的方法

    C++删除链表中间节点的方法

    这篇文章主要介绍了C++删除链表中间节点的方法,结合实例形式分析了链表删除中间节点的具体思路与实现技巧,需要的朋友可以参考下
    2017-05-05

最新评论