参考链接

  1. https://www.bilibili.com/video/BV1et411b73Z?p=106

构造函数和析构函数

对象的初始化和清理是两个非常重要的安全问题:

  1. 一个对象或者变量没有初始状态,对其使用后果是未知
  2. 使用完一个对象或变量,没有及时清理,也会造成一定的安全问题

C++利用构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。如果不提供构造函数和析构函数,编译器会提供空实现的构造函数和析构函数。

构造函数

作用

主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用。

语法

类名(){}
  1. 构造函数,没有返回值也不写void
  2. 函数名称与类名相同
  3. 构造函数可以有参数,因此可以发生重载
  4. 程序在调用对象时候会自动调用构造,无需手动调用,而且只会调用一次

分类

  1. 按参数分为:有参构造和无参构造(默认构造)
    例如:
class Person
{public:Person(){cout << "调用无参构造函数" << endl;}Person(int a){cout << "调用有参构造函数" << endl;}~Person(){cout << "调用析构函数" << endl;}
};
  1. 按类型分为:普通构造和拷贝构造
// 拷贝构造函数
Person(const Person &p)
{age = p.age;
}

调用方式

括号法
Person p1; // 默认构造函数调用
Person p2(10); // 有参构造函数调用
Person p3(p2); // 拷贝构造函数调用
注意事项

调用默认构造函数的时候,不要加()。因为这行代码,编译器会认为是函数声明。

显示法
Person p2 = Person(10);
Person p3 = Person(p2);
注意事项
  1. Person(10); // 匿名对象,当前行执行结束后,系统会立即回收掉匿名对象
  2. 不要利用拷贝构造函数初始化匿名对象。如Person(p3);,编译器会认为Person(p3) === Person p3;,对象重定义。
隐式转换法
Person p4 = 10; // 相当于写了Person p4 = Person(10);,有参构造
Person p5 = p4; // 拷贝构造

拷贝构造函数的调用时机

C++中拷贝构造函数调用时机通常有三种情况:

  1. 使用一个已经创建完毕的对象来初始化一个新对象
void test()
{Person p1(20);Person p2(p1);
}
  1. 值传递的方式给函数参数传值
void doWork(Person p){}
void test02()
{Person p;doWork(p);
}
  1. 以值方式返回局部对象
Person doWork2()
{Person p1;return p1;
}
void test03()
{Person p = doWork2();
}

构造函数调用规则

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

  1. 默认构造函数(无参,函数体为空)
  2. 默认析构函数(无参,函数体为空)
  3. 默认拷贝函数,对属性进行值拷贝

构造函数调用规则如下:

  1. 如果用户定义有参构造函数,C++不再提供默认无参构造函数,但会提供默认拷贝函数
  2. 如果用户定义拷贝构造函数,C++不再提供其他构造函数

深拷贝与浅拷贝

浅拷贝

简单的赋值拷贝操作。

浅拷贝带来的问题就是堆区的内存重复释放

深拷贝

在堆区重新申请空间,进行拷贝操作
例如:

Person(const Person &p)
{cout << "Person拷贝构造函数调用" << endl;m_Age = p.m_Age;// m_Height = p.m_Height; 编译器默认实现// 深拷贝操作m_Height = new int(*p.m_Height);
}

初始化列表

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

语法
构造函数(): 属性1(值1), 属性2(值2)...{}

例如:

Person(int a, int b, int c): m_A(a), m_B(b), m_C(c){}

析构函数

作用

主要作用在于对象销毁前系统自动调用,执行一些清理工作。

语法

~类名(){}
  1. 析构函数,没有返回值也不写void
  2. 函数名称与类名相同,在名称前加上符号~
  3. 析构函数不可以有参数,因此不可以发生重载
  4. 程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次
    析构函数中,可以将堆区开辟数据做释放
    例如:
~Person()
{if (m_Height != NULL){delete m_Height;m_Height = NULL;}
}

C++入门——构造函数和析构函数相关推荐

  1. C++编程入门系列之十四(类与对象:构造函数和析构函数)

    C++编程入门系列之十四(类与对象:构造函数和析构函数) 鸡啄米上一节中给大家讲解了类的声明.成员的访问控制和对象,今天鸡啄米给大家讲C++编程入门时同样必须掌握的构造函数和析构函数.从上一讲开始已经 ...

  2. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  3. C++入门:构造函数,析构函数,拷贝构造函数,运算符重载详解

    目录 类的6个默认成员函数 一.构造函数 1.概念 2.特征如下: (1) 函数名与类名相同. (2)无返回值. (3)对象实例化时编译器自动调用对应的构造函数. (4)构造函数可以重载. (5)如果 ...

  4. python在删除对象时会自动调用析构函数_Python面向对象程序设计构造函数和析构函数用法分析...

    本文实例讲述了Python面向对象程序设计构造函数和析构函数用法.分享给大家供大家参考,具体如下: 构造函数和析构函数 1.构造方法的使用 很多类都倾向于将对象创建为有初始化状态.因此类可以定义一个名 ...

  5. C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)

    1. 构造函数 构造函数是一种特殊的函数(方法),在根据类创建对象时被调用.构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化. 构造函数的名称与类的名称是完全相同的,并且不会 ...

  6. php构造和析构方法,php5构造函数与析构函数实例

    自php5起,有了构造函数与析构函数. 这使得php更富有面向对象的魅力了. 在php4时,构造函数用的是与类同名的函数来进行构造这个动作. 例如: 复制代码 代码示例: /* * myclass.p ...

  7. 提高C++性能的编程技术笔记:构造函数和析构函数+测试代码

    对象的创建和销毁往往会造成性能的损失.在继承层次中,对象的创建将引起其先辈的创建.对象的销毁也是如此.其次,对象相关的开销与对象本身的派生链的长度和复杂性相关.所创建的对象(以及其后销毁的对象)的数量 ...

  8. c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

    说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...

  9. C++中的构造函数VS析构函数

    1.构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行.构造函数的名称与类的名称的完全相同的,并且不会返回任何数据类型,也不会返回void.构造函数用于为某些成员变量设置初 ...

最新文章

  1. Linux系统管理必备知识之查看系统用户和用户组
  2. DIV周边添加投影及背景固定
  3. 面板——卡片面板、常规折叠面板、手风琴折叠
  4. 【数据结构与算法】之深入解析“下一个更大元素I”的求解思路与算法示例
  5. delphi打开word文件(刚刚学会的嘿嘿~)
  6. linux同步数据库,Linux两台服务器mysql数据库同步
  7. ie6使用绝对定位position:absolute,box不显示
  8. [UIKit学习]00.关于前置知识(storyboard,UIViewController,类扩展,项目属性)
  9. Linux下连接SQL Server
  10. 开源电子海图和webGIS
  11. c++ 读取二进制bin文件
  12. 人工智能常用的编程语言
  13. 矩阵转置---c语言实现
  14. 千牛挂“虹(Rainbow)”,域和角色不胜数
  15. node ncc 打包
  16. jumpserver管理员账号被锁定
  17. 计算机音乐谱夜空中最亮的星歌词,夜空中最亮的星简谱及歌词
  18. 【Framework】透视Android中的Handler
  19. html怎么消除打印的进纸,打印机进纸打印故障解决秘方实例
  20. 大厂网络工程师面试题整理汇总

热门文章

  1. MongoDB 全文索引
  2. 5G规范的“里程碑”与高通的有所为
  3. 微信登陆报redirect_uri 参数错误
  4. 初中计算机课堂游戏设计方案,初中信息技术教学设计
  5. WPF MVVM模式的应用——室内监控可视化
  6. int类型转换String类型,String类型转换成int类型
  7. 博图只能通过地址相同设备找到plc_【新手】西门子博图基本操作
  8. 金额转中文大写源代码(原创)
  9. 更换window上文件夹图标和记事本图标
  10. 软件架构模式和设计模式