1. 嘛是拷贝构造函数?

    如果一个构造函数的第一个参数是’自身类‘ ‘类型’的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。如:

    【代码1】

    1
    2
    3
    4
    5
    6
    class A{
    public
       A();         //默认构造函数
       A(const A&); //拷贝构造函数;const可省略,但此参数几乎总是一个const的引用!
       //其他内容
    };

    拷贝构造函数会被隐式地使用,所以不应该定义成explicit的(explicit构造函数将限制隐式转换,只能以直接初始化的形式使用,如代码2)

    【代码2】

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class B{
    public:
       B()=default;
       explicit B(int); //阻止了隐式转换
       B(int,int);     //explicit只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换,故无需使用explicit
       //其他内容
    private:
       int value;
    };
    //explicit关键字只能出现在类内的构造函数声明处,在类外不能使用!如下:
    explicit B:B(int a){ //错误!!!
       value=a;
    }
    //类B的对象使用代码:
    B b();   //正确!
    B b(0);  //正确!直接初始化形式
    B b=0;   //错误!不能将explicit构造函数用于拷贝形式的初始化过程
    B b(0,0);//正确!

    当我们自己定义了一个默认构造函数后,编译器就不会为我们再定义一个合成的构造函数,但拷贝构造函数不同!即使我们自己定义的有,编译器也会我们再定义一个!一般情况下,其作用为:将其参数的成员逐个拷贝到正在创建的对象中。即编译器会从参数中给定的对象中依次将每个非static的成员拷贝到正在创建的对象中。内置类型的成员直接拷贝,类类型的成员使用其类自身的拷贝构造函数进行拷贝。

    同时,如果一个类有一个‘移动构造函数’,则拷贝初始化有时会使用移动构造函数而非拷贝构造函数来完成拷贝。

  2. 什么情况下需要使用拷贝初始化?

    【1:使用=定义变量时;如:A a=0;

    【2:将一个对象作为实参传递给一个非引用类型的形参时;

    【3:从一个返回类型是非引用类型的函数中返回一个对象时;

    【4:用花括号列表初始化一个数组中的元素或一个聚合类中的成员时。

  3. ​为什么拷贝构造函数的参数必须是引用类型?

    拷贝构造函数被用来初始化’非引用类‘类型参数!如果参数不是引用类型,则为了调用拷贝构造函数,就必须拷贝其实参,但为了拷贝其实参,又需要调用拷贝构造函数,如此无限循环下去。具体例子请参照:拷贝构造函数的参数为什么必须使用引用类型

C++学习之拷贝构造函数的更多相关文章

  1. C++学习之拷贝构造函数篇

    一.拷贝构造函数的声明 Array(const Array & arr); 二.拷贝构造函数的实现分为两种,即是深拷贝和浅拷贝. 1.浅拷贝 代码例如以下: class Array { pub ...

  2. c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)

    这节课在p26.拷贝构造中讲的很清楚,建议大家耐心的去看下. 什么时候会发生拷贝构造: 对象之间的初始化赋值 使用对象作为变量进行函数传参(通常使用引用来传参从而减去不必要的拷贝构造,提高效率和代码健 ...

  3. 如何避免被C++默认拷贝构造函数忽悠?

    一.背景介绍           因为工作关系,需要用到C++编程.对于我来说,虽然一直从事的是linux平台下的嵌入式软件开发,但深入用到C++的特性的地方并不多.对于C++,用得最多的无非是指针. ...

  4. 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符

    学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...

  5. 《挑战30天C++入门极限》C++类对象的复制-拷贝构造函数

        C++类对象的复制-拷贝构造函数 在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int ...

  6. C++类中函数(构造函数、析构函数、拷贝构造函数、赋值构造函数)

    [1]为什么空类可以创建对象呢? 示例代码如下: #include <iostream> using namespace std; class Empty { }; void main() ...

  7. C++中的赋值操作符重载和拷贝构造函数

    1,关于赋值的疑问: 1,什么时候需要重载赋值操作符? 2,编译器是否提供默认的赋值操作符? 2,关于赋值的疑问: 1,编译器为每个类默认重载了赋值操作符: 1,意味着同类型的类对象可以相互赋值: 2 ...

  8. C++ 拷贝构造函数和赋值运算符

    本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...

  9. C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别

    class TestChild { public: TestChild() { x=; y=; printf("TestChild: Constructor be called!\n&quo ...

随机推荐

  1. xpath的基础使用

    一.xpath简介 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 使用路径表达式在 XML 文档中进行导航 XPath 包 ...

  2. AD域账号验证

    public partial class _Default : Page { [DllImport("advapi32.dll")] private static extern b ...

  3. python 中is和= = 的区别

    Python中的对象包含三要素:id.type.value,其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值. is判断的是a对象是否就是b对象,是通过id来判断的: ==判 ...

  4. poj 1001 字符串乘法以及处理精度问题

    #include<iostream> #include<cstring> using namespace std; int main() { string r; int n,d ...

  5. 转 oracheck

    转 https://dbaplus.cn/news-10-220-1.html ORAchk 之前被称为RACcheck,后来它的检查范围进行了扩展,改名为了ORAchk,它是在数据库系统进行健康检查 ...

  6. 登陆jq表单验证及jqcookie记住密码实例

    <p><%@ page contentType="text/html; charset=utf-8"%> <%@taglib prefix=" ...

  7. (转)Linux curl命令详解

    命令:curl在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具. ...

  8. OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(下)

    上期我们完成了一个简单的主从页面,但是页面是静态的,不能交互,功能也很简单,只有一个销售订单的列表. 我们今天就一鼓作气把代码全都写完,由于本次的代码量较大,所以只对重点代码部分进行讲解. 具体每个文 ...

  9. 查看SQL Server中的锁表及解锁

    有时候系统很慢,有可能是SQL Server数据库中某些表被锁定 --查看被锁表(需查多几次,有些临时锁很快会自动解锁): SELECT request_session_id AS spid, OBJ ...

  10. Razor,aspx的占位控件(母版页)

    1.razor: 母版页中:@*类似master的占位控件*@ @RenderSection("scripts", required: false) 部分页中: @section ...