• 第四篇:了解 C++ 默默编写并调用的函数


    前言

           对于一个类来说,最最基础的三类成员函数莫过于:构造函数,析构函数以及拷贝函数 (copy构造函数和=重载函数)。即使你的类没有为这些函数做出定义,C++ 也会自动为你创建。本文将讲述的是 C++ “偷偷”为你创建的这三个函数究竟是怎么样的。

           了解这些,能更清楚代码是如何运转的,从而写出自己需求的(这三类)函数,确保对象高效,节约。

    默认的构造函数和析构函数

           默认的构造函数/析构函数主要负责调用其基类的构造函数/析构函数。

    默认的copy构造函数和=重载函数

           默认的这两个函数仅仅是将对象的成员进行简单赋值。

           这就意味着,如果该类的成员是指针类型,那么当该类的两个对象之间发生赋值后,这两个对象中的指针就会指向同一片内存区。这种情况下,内存管理就会复杂起来,后面的文章中会详细讲解如何解决这个问题 - 在类的不同对象之间共享内存区。

           有时候,如果你不需要在内存中实现共享,完全可以自行定义这两个函数,为被赋值的对象分配新的内存区。

           那么,如果类成员是引用类型呢?如果对象之间成员只是简单的复制,那么岂非出现一个引用型变量引用了新的变量?这是违反 C++ 的”不允许引用型变量改指向不同的对象“这一原则的。

           答案是 - C++ 会拒绝编译那一行的赋值操作。

    小结

           1. 编译器所做的工作等效于:

    1 class Empty {
    2 public:
    3     Empty(){}    // 缺省构造函数
    4     Empty(const Empty &rhs){}    // 缺省拷贝构造函数
    5     ~Empty(){}    // 缺省析构函数
    6     Empty & operator= (const Empty &rhs);    // 缺省赋值运算符重载函数
    7 };

           2. 如果 C++ 默认为你定义的这三类函数不合你的要求,这也是经常发生的,那么你就需要结合实际情况,定制出最适合自己的函数。

           3. 这三类函数非常重要,请一定要确保其正确性,效率性,否则项目后期因此而产生的内存泄露等问题是非常让人头大的。

  • 相关阅读:
    Linux c++ time different
    数据库初始化以及制作为Windows服务
    数据库无法注册服务
    JS中String转int
    数据库服务注册(使用命令注册):解决my.ini配置文件不存在的问题
    数据库启动丢失MSVCP120.dll
    jQuery
    BOM和DOM
    用yield实现python协程
    深入理解python中的yield关键字
  • 原文地址:https://www.cnblogs.com/muchen/p/6353735.html
Copyright © 2020-2023  润新知