C++学习之拷贝构造函数
嘛是拷贝构造函数?
如果一个构造函数的第一个参数是’自身类‘ ‘类型’的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。如:
【代码1】
123456class
A{
public
:
A();
//默认构造函数
A(
const
A&);
//拷贝构造函数;const可省略,但此参数几乎总是一个const的引用!
//其他内容
};
拷贝构造函数会被隐式地使用,所以不应该定义成explicit的(explicit构造函数将限制隐式转换,只能以直接初始化的形式使用,如代码2)
【代码2】
123456789101112131415161718class
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的成员拷贝到正在创建的对象中。内置类型的成员直接拷贝,类类型的成员使用其类自身的拷贝构造函数进行拷贝。
同时,如果一个类有一个‘移动构造函数’,则拷贝初始化有时会使用移动构造函数而非拷贝构造函数来完成拷贝。
什么情况下需要使用拷贝初始化?
【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 ...
随机推荐
- Ubuntu 14.04下MySQL服务器和客户端的安装
下面进行简单的配置 安装完成后通过修改/etc/mysql/my.cnf(此文件为mysql的配置文件).将文件中的binding-address=127.0.0.1注释掉.其它配置根据需要更改. H ...
- http 和 https 的区别
参考:http://www.cnblogs.com/wqhwe/p/5407468.html HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从W ...
- OpenCV属性页配置问题~
详细的OpenCV属性页的安装流程,参考这个网站:http://m.bubuko.com/infodetail-793518.html 运行例子时候,如果遇到这个问题,可能配置环境时候出现问题了. 此 ...
- CSS控制标题字符长度的方法
<style type="text/css"> .abc { background-color: #CCC; width: auto; overflow:hidden; ...
- JS 获取get请求方式的参数
//获取页面中的参数 name值参数名称(例如:http://localhost:8099/index.aspx?id=10,name则指的是id)function GetQueryString ...
- 以多进程读取oss符合条件的数据为例,综合使用多进程间的通信、获取多进程的数据
import datetime import sys import oss2 from itertools import islice import pandas as pd import re im ...
- 浅谈soa之RESTful
今晚打算花点时间整理一下面向服务的架构oap.1传统中小型项目架构一般是这样的:(java)html+servlet+jdbc.和(.net)html+handler+ado.net都是在一台应用来. ...
- Mac 系统变量
vim .bash_profile ========================= MAVEN_HOME = < ... > export MAVEN_HOME =========== ...
- UnityError 以下文件中的行尾不一致,要将行尾标准化吗?
- python3+Appium自动化10-日志收集
日志概述 日志作用 日志是定位问题的重要手段 日志级别 级别 何时使用 DEBUG 调试信息,也是最详细的日志信息 INFO 证明事情按预期工作 WARNING 表明发生了一些意外,或者不就的将来(如 ...