构造函数

构造函数包括默认构造函数、拷贝构造函数和一般构造函数。
在编程时,如果程序员不显式声明和定义上述函数,编译器将自动产生4个public inline的默认函数。
  • A();                        // 默认构造函数
  • A(const A&);                // 拷贝构造函数
  • A& operator=(const A& a)    // 拷贝构造函数
  • ~A();                       // 默认析构函数

默认构造函数

当一个类没有定义构造函数时,编译器才生成默认构造函数。

当定义类对象没有提供初始化式时,使用默认构造函数进行初始化。

没有默认构造函数的类的局限
  • 具有该类类型成员的类,必须通过构造函数初始化列表进行初始化。
  • 该类不能用作动态分配数组(new)的元素类型。
  • 使用该类作为元素类型的静态数组,必须显式初始化。
  • 不适用于没有提供初始化的容器

默认构造函数的使用

  • A test();       ×
  • A test;         √
  • A test = A();   √

拷贝构造函数

对于一个类X,如果一个构造函数的第一个参数是下列之一:

  • X&
  • const X&
  • volatile X&
  • const volatile X&

且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数。

拷贝构造函数不能由成员函数模版生成.

何时发生拷贝
  • 手动调用
  • 函数返回类对象
  • 函数有类类型参数
  • 容器初始化
隐患
  • 当类有指针类型的成员时,简单拷贝(浅拷贝)将造成两个不同对象的指针指向同一区域,出现访问冲突、多次delete等错误。
  • 大量拷贝构造函数的调用,降低运行效率。
解决
  • 显式定义拷贝构造函数(为指针重新申请内存,并拷贝内存数据 -- 深拷贝)
  • 禁止拷贝(通过成员函数进行赋值,提高运行效率)
如何禁止拷贝

1 class Widget
2 {
3     ...
4 private:
5     Widget(const Widget&);  // 声明为私有
6     Widget& operator=(const Widget&);
7 }

View Code

转载于:https://www.cnblogs.com/TaoyzDream/p/3688331.html

默认构造函数和拷贝构造函数相关推荐

  1. C++ : 构造函数,拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符应用场景

    构造函数,拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符应用场景 #include <iostream> using namespace std;class Construct ...

  2. 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序

    构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 对象是由"底层向上"开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达 ...

  3. 构造函数,拷贝构造函数,赋值函数

        C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...

  4. 构造函数、拷贝构造函数、赋值函数和析构函数

    文章目录 一.构造函数 1.认识构造函数 2.初始化列表 二.拷贝构造函数 1.类对象的拷贝 2.浅拷贝和深拷贝 三.赋值函数 四.析构函数 1.认识析构函数 2.销毁,清理? 3.析构函数来阻止该类 ...

  5. C++ 构造函数、复制构造函数,拷贝构造函数(深拷贝、浅拷贝)

    文章目录 前言 一.什么是构造函数? 二.构造函数的分类 复制构造函数 复制构造函数被调用的三种情况 复制构造函数在以下三种情况下会被调用. 三.拷贝构造函数的分类 深.浅拷贝构造函数的区别 示例代码 ...

  6. 不存在从void转换到sqlist的适当构造函数_拷贝构造函数与赋值构造函数

    拷贝构造函数与赋值构造函数 在C++中,如果要创建一个新的类,并用已有的类来给它附初值.就要用到拷贝构造函数,拷贝构造函数又分为两种. 1.合成的拷贝构造函数 在你没有定义自己的拷贝构造函数而又调用了 ...

  7. String 的普通构造函数、拷贝构造函数、析构函数、赋值函数

    转自:http://blog.csdn.net/xiaoxiangzhu660810/article/details/8149398 题目:编写类String的构造函数.析构函数和赋值函数,已知类St ...

  8. 类string的构造函数、拷贝构造函数和析构函数

    原文:http://www.cnblogs.com/Laokong-ServiceStation/archive/2011/04/19/2020402.html 类string的构造函数.拷贝构造函数 ...

  9. 移动构造函数和拷贝构造函数的区别

    讲讲移动构造函数与拷贝构造函数的区别 :移动构造函数是c++11的新特性,移动构造函数传入的参数是一个右值 用&&标出.一般来说左值可以通过使用std:move方法强制转换为右值.首先 ...

最新文章

  1. shell if else
  2. Linux系统:centOS 7 忘记密码怎么办?
  3. 编程之美——4.11 扫雷游戏的概率
  4. cps1 cps2 android,图文教程:CPS1和CPS2模拟器使用
  5. Windows 7技巧之Telnet组件消失之迷
  6. python 多个列表_Python同时迭代多个列表
  7. VI3的VLAN配置:VST、EST和VGT标记
  8. 普通人看Build 2019 值得留心的亮点有哪些?
  9. 关于python语言和人工智能下哪个说法不正确_“在资源管理器”窗口中,文件夹图标左侧有“...
  10. RAID5阵列掉盘显示未初始化---解决过程
  11. React Native npm镜像安装命令
  12. 【实战项目惜时App项目总结分析】Vue-cli3+Vant UI+Vue-element-admin+Egg.js+Mysql
  13. 其他——dhtmlxGantt甘特图API精华总结
  14. Java 面试题看这些就够了
  15. 智能扫地机器人哪个品牌好?最受欢迎排行榜前十名
  16. 这就是传说中的一行代码一句注释?Python每日一练----种花
  17. Eclipse汉化方法以及汉化包
  18. iOS POS之3DES加密
  19. [LLVM教程]LLVM之第一个语言前端
  20. 镜头像差之一——球差

热门文章

  1. qt 雷达扫描障碍物_自动驾驶系统入门(五) - 激光雷达
  2. postgresql参数化查询_一个能融会贯通PostgreSQL监控的人,大概率是高手
  3. c语言点阵字符,点阵的汉字程序
  4. java猴子吃香蕉_Java 猴子分香蕉
  5. python求两数之和的命令_python实现读取命令行参数的方法
  6. 电路板上的插头怎么拔下来_中国连城 | 接插件在电路板上的作用及它的种类介绍...
  7. 安装linux并卸载windows,如何在安装双启动后卸载 Windows 或者 Linux
  8. java code combat_极客战记怎么换成java_「网易官方」极客战记(codecombat)攻略-沙漠-脆弱的士气......
  9. python unit test 访问开发代码_python unittest 源码分析
  10. ajax put请求_前端基础面试:手写一个ajax,说说XMLHttpRequest 都有哪些属性?