C++学习之拷贝构造函数
嘛是拷贝构造函数?
如果一个构造函数的第一个参数是’自身类‘ ‘类型’的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。如:
【代码1】
123456classA{public:A();//默认构造函数A(constA&);//拷贝构造函数;const可省略,但此参数几乎总是一个const的引用!//其他内容};拷贝构造函数会被隐式地使用,所以不应该定义成explicit的(explicit构造函数将限制隐式转换,只能以直接初始化的形式使用,如代码2)
【代码2】
123456789101112131415161718classB{public:B()=default;explicit B(int);//阻止了隐式转换B(int,int);//explicit只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换,故无需使用explicit//其他内容private:intvalue;};//explicit关键字只能出现在类内的构造函数声明处,在类外不能使用!如下:explicit B:B(inta){//错误!!!value=a;}//类B的对象使用代码:B b();//正确!B b(0);//正确!直接初始化形式B b=0;//错误!不能将explicit构造函数用于拷贝形式的初始化过程B b(0,0);//正确!当我们自己定义了一个默认构造函数后,编译器就不会为我们再定义一个合成的构造函数,但拷贝构造函数不同!即使我们自己定义的有,编译器也会我们再定义一个!一般情况下,其作用为:将其参数的成员逐个拷贝到正在创建的对象中。即编译器会从参数中给定的对象中依次将每个非static的成员拷贝到正在创建的对象中。内置类型的成员直接拷贝,类类型的成员使用其类自身的拷贝构造函数进行拷贝。
同时,如果一个类有一个‘移动构造函数’,则拷贝初始化有时会使用移动构造函数而非拷贝构造函数来完成拷贝。
什么情况下需要使用拷贝初始化?
【1:使用=定义变量时;如:A a=0;
【2:将一个对象作为实参传递给一个非引用类型的形参时;
【3:从一个返回类型是非引用类型的函数中返回一个对象时;
【4:用花括号列表初始化一个数组中的元素或一个聚合类中的成员时。
为什么拷贝构造函数的参数必须是引用类型?
拷贝构造函数被用来初始化’非引用类‘类型参数!如果参数不是引用类型,则为了调用拷贝构造函数,就必须拷贝其实参,但为了拷贝其实参,又需要调用拷贝构造函数,如此无限循环下去。具体例子请参照:拷贝构造函数的参数为什么必须使用引用类型
C++学习之拷贝构造函数的更多相关文章
- C++学习之拷贝构造函数篇
一.拷贝构造函数的声明 Array(const Array & arr); 二.拷贝构造函数的实现分为两种,即是深拷贝和浅拷贝. 1.浅拷贝 代码例如以下: class Array { pub ...
- c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)
这节课在p26.拷贝构造中讲的很清楚,建议大家耐心的去看下. 什么时候会发生拷贝构造: 对象之间的初始化赋值 使用对象作为变量进行函数传参(通常使用引用来传参从而减去不必要的拷贝构造,提高效率和代码健 ...
- 如何避免被C++默认拷贝构造函数忽悠?
一.背景介绍 因为工作关系,需要用到C++编程.对于我来说,虽然一直从事的是linux平台下的嵌入式软件开发,但深入用到C++的特性的地方并不多.对于C++,用得最多的无非是指针. ...
- 【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符
学习资料 • 派生类的赋值运算符/赋值构造函数也必须处理它的基类成员的赋值 • C++ 基类构造函数带参数的继承方式及派生类的初始化 定义拷贝构造函数 [注意]对派生类进行拷贝构造时,如果想让基类的成 ...
- 《挑战30天C++入门极限》C++类对象的复制-拷贝构造函数
C++类对象的复制-拷贝构造函数 在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int ...
- C++类中函数(构造函数、析构函数、拷贝构造函数、赋值构造函数)
[1]为什么空类可以创建对象呢? 示例代码如下: #include <iostream> using namespace std; class Empty { }; void main() ...
- C++中的赋值操作符重载和拷贝构造函数
1,关于赋值的疑问: 1,什么时候需要重载赋值操作符? 2,编译器是否提供默认的赋值操作符? 2,关于赋值的疑问: 1,编译器为每个类默认重载了赋值操作符: 1,意味着同类型的类对象可以相互赋值: 2 ...
- C++ 拷贝构造函数和赋值运算符
本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...
- C++ 一个例子彻底搞清楚拷贝构造函数和赋值运算符重载的区别
class TestChild { public: TestChild() { x=; y=; printf("TestChild: Constructor be called!\n&quo ...
随机推荐
- 关于django的模板层
你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now = datet ...
- CVE-2015-1635(MS15-034 )进行DOS攻击
上一篇的文章方法进行检测漏洞是否存在,接着我们搭建win2008进行DOS攻击测试,导致服务器蓝屏,异常关机. 靶机:windows2008 IIS7.0 192.168.31.91 攻 ...
- Javascript各种事件汇总
https://www.cnblogs.com/diligenceday/p/4190173.html#undefined https://www.cnblogs.com/starof/p/40663 ...
- Vue.js-----轻量高效的MVVM框架(一、初识Vue.js)
1.什么是Vue.js? 众所周知,最近几年前端发展非常的迅猛,除各种框架如:backbone.angular.reactjs外,还有模块化开发思想的实现库:sea.js .require.js .w ...
- leetcode 925. 长按键入
题目描述: 你的朋友正在使用键盘输入他的名字 name.偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次. 你将会检查键盘输入的字符 typed.如果它对应的可能是你的朋友的 ...
- selenium-webdriver(python) (十四) -- webdriver原理(转)
之前看乙醇视频中提到,selenium 的ruby 实现有一个小后门,在代码中加上$DEBUG=1 ,再运行脚本的过程中,就可以看到客户端请求的信息与服务器端返回的数据:觉得这个功能很强大,可以帮助理 ...
- Hidden Markov Models笔记
Andrew Ng CS229 讲义: https://pan.baidu.com/s/12zMYBY1NLzkluHNeMNO6MQ HMM模型常用于NLP.语音等领域. 马尔科夫模型(Markov ...
- python 之serial
一 先按照 pywin32:pywin32是一个非常强大的Python扩展库,是Python调用Windows系统底层功能的最佳接口,不安装这个按照pyserial也没有用 二 按装pyserial ...
- Tomcat WEB搭建+Nginx负载均衡动静分离+DNS解析的实验
实验拓扑图: 实验环境: 在VMware workstation搭建虚拟环境,利用网络适配器的Nat和桥接模式模拟内网和外网环境. 实验过程中需要安装的工具包包括:vim unzip lrzsz ls ...
- Windows Server 2012 R2
Windows Server 2012 R2 历史上的Server有2003 server, 2008 server, 2012 server windows server 2012 r2对计算机的消 ...