前言

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

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

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

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

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

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

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

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

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

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

小结

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

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

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

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

了解 C++ 默默编写并调用的函数的更多相关文章

  1. EC笔记,第二部分:5.了解C++默默编写并调用哪些函数

    5.了解C++默默编写并调用哪些函数 1.C++空类 C++会为一个空类建立以下函数 (1).默认构造函数 (2).默认拷贝构造函数 (3).析构函数 (4).赋值运算符(如果成员包含引用类型或con ...

  2. Effective C++ 之 Item 5:了解C++默默编写并调用哪些函数

    Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 5 ...

  3. 条款05:了解C++默默编写并调用哪些函数

    每一个class都会有一个或多个构造函数.一个析构函数.一个copy assignment操作符.这些控制着基础操作,像是产出新对象并确保它被初始化.摆脱旧对象并确保它被适当清理.以及赋予对象新值. ...

  4. C++编译器默默编写并调用哪些函数

    什么时候empty class(空类)不再是个empty class呢?当C++处理过它之后,是的,如果你自己没有声明,编译器就会为它声明(编译器版本)一个copy构造函数.一个copy assign ...

  5. [Effective C++ --005]了解C++默默编写并调用哪些函数

    <前言>编译器是个十分敬业的工作者,不但为你编译代码,甚至为你生成代码,不可思议吧.本文主要介绍编译器究竟会为我们生成和调用哪些代码. <空类和非空类>如果问什么样的类是空类? ...

  6. effective c++(05)(06)之c++默默编写并调用的函数

    1. 当只写一个空类的时候,编译器会为他声明一个copy构造函数,一个copy assignment函数和一个析构函数.如下: 如果写下: class Empty{ }; 编译器就会实现以下代码: c ...

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

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

  8. Effective C++条款05:了解C++默默编写并调用哪些函数

    class Empty{}; class Empty{ Empty(){}; Empty(const Empty& rhs){}; ~Empty(){}; Empty& operato ...

  9. 【05】了解C++默默编写并调用那些函数

    1.如果没有声明copy构造方法,copy赋值操作符,和析构方法,编译器会自动生成这些方法,且是inline. 2.如果没有声明任何构造方法,编译器会自动生成一个default构造方法,且是inlin ...

随机推荐

  1. HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置

    答案:在将WebDataHelper升级到VS2013是出现的这个错误,这个程序使用了URL重写的技术, 解决方法是:需要将重写的配置,迁移到system.webServer配置节中

  2. LAMP整理

    LAMP第一部分 查看编译了哪些软件:是编译时自动生成的 Cat /usr/local/apache2/build/config.nice 网站根目录存放处: /usr/local/apache2/h ...

  3. Error initializing endpoint java.lang.Exception: Socket bind failed: [730048] ?????????×???(Э?é/???????/???)????í??

    2010-5-18 22:00:38 org.apache.catalina.core.AprLifecycleListener lifecycleEvent 信息: The Apache Tomca ...

  4. 最新电Call记录统计-full hash join用法

    declare @time datetime set @time='2016-07-01' --最新的电Call记录统计查询--SELECT t.zuoxi1,t.PhoneCount,t.Phone ...

  5. JAVA输出图形(网上找的)

    public class TuXing { public static void main(String[] args) { int i, j, k; for (i = 1; i <= 5; i ...

  6. 快餐问题(dp好题)

    Peter最近在R市开了一家快餐店,为了招揽顾客,该快餐店准备推出一种套餐,该套餐由A个 汉堡,B个薯条和C个饮料组成.价格便宜.为了提高产量,Peter从著名的麦当劳公司引进了N条 生产线.所有的生 ...

  7. jQuery对表单元素的取值和赋值操作代码

    使用常规的思路:$(“#keyword”).value 取值是取不到的,因为此时$(‘#keydord’)已经不是个element,而是个jquery对象,所以应该使用:$(“#keyword”).v ...

  8. 移动设备和SharePoint 2013 - 第5部分:自定义应用

    博客地址:http://blog.csdn.net/foxdave 原文地址 在该系列文章中,作者展示了SharePoint 2013最显著的新功能概观--对移动设备的支持. 该系列文章: 移动设备和 ...

  9. Browser GetImage

    using Microsoft.Win32; using System; using System.ComponentModel; using System.Drawing; using System ...

  10. Oracle GoldenGate Veridata 12.1.3已经发布

    通过GoldenGate Veridata 12.1.3,现在只需要一键点击即可修复数据复制后不一致的数据. veridata 架构