前言

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

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

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

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

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

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

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

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

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

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

小结

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

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

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

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

最新文章

  1. ORA-27101: shared memory realm does not exist
  2. java selenium (十) 操作浏览器
  3. html之marquee详解
  4. [SSH服务]——SSH详解、常用的远程连接工具
  5. Struts2_搭建环境及HelloWorld
  6. 基于Redis主从复制读写分离架构的Session共享
  7. php exit、return、break、continue之间的差别,具体介绍
  8. HQL查询——查询返回对象类型分析
  9. Python之io概念
  10. JS实现购物商城商品放大
  11. 【keepalived】CentOS7.0下安装教程
  12. tiny png
  13. day2模块初识别
  14. django笔记 - 建站
  15. 解决openwrt中文界面异常
  16. 【转载】springboot:如何优雅的使用mybatis
  17. 【Algorithm】自底向上的归并排序
  18. jq 获取name值一样的数组
  19. J2SE 8的脚本
  20. 7、Java并发编程:深入剖析ThreadLocal

热门文章

  1. .net调用存储过程碰到的一个问题
  2. 使用SoundPool播放音效
  3. UVa 11426 - GCD - Extreme (II)
  4. Zabbix页面遇到历史记录的乱码需要修改数据库
  5. not use jquery
  6. Linux-守护进程的实现
  7. android 回调函数
  8. JVM-class文件完全解析-方法表集合
  9. Ubuntu 14.10 下设置时间同步
  10. (转)html5开发之viewport使用