构造函数与拷贝构造函数
拷贝构造函数和构造函数不能分开说,他们都是初始化对象的一种方法。但是我们这里用构造函数辅助说明拷贝构造函数,主要说说拷贝构造函数的声明,用途和使用注意事项。
众所周知,构造函数是一个初始化类对象的函数,即使不显示调用,编译器也会隐式调用构造函数初始化类对象。同样的,拷贝构造函数是一种特殊的构造函数,目的也是初始化类对象,同样在不声明的情况下也会隐式调用该函数。而隐式调用拷贝构造函数的时候,我们称之为“浅拷贝”。但是,请注意一点,并不是说显示调用就是“深拷贝”,而是如果要深拷贝一定要显示调用。
深浅拷贝后文会说,现在我们着重考虑其用途:
#include <iostream>
using namespace std;
class A{
private:int a;
public:A(int b):a(b){cout<<"构造函数"<<endl;}A(const A& c){a = c.a;cout<<"拷贝构造函数"<<endl;}~A(){cout<<"析构函数"<<endl;}
};
int main(){A a(100); //调用构造函数A b = a; //调用拷贝构造函数return 0;
}
看图,当创建了一个对象a时,编译器调用构造函数将a初始化为100。当又创建了一个对象b,将a赋值于b,此时调用拷贝构造函数将b初始化。最后由于调用了一次构造函数一次拷贝构造函数,所以析构函数被调用两次。
那么将主函数部分稍作修改,改成:
int main(){A a(100);A b(200);b = a;return 0;
}
会怎样呢?
可见,当我们对函数初始化完成,就不会再调用拷贝构造函数了,这时候b=a就是简单的赋值运算操作,和拷贝构造无关。
程序稍作改动,当类对象以参数的形式存在在普通函数中,会怎么样?
#include <iostream>
using namespace std;
class A{
private:int a;
public:A(int b):a(b){cout<<"构造函数"<<endl;}A(const A& c){a = c.a;cout<<"拷贝构造函数"<<endl;}~A(){cout<<"析构函数"<<endl;}void newA(A b){cout<<"bbbbb"<<endl;}
};
int main(){A a(100);a.newA(a);return 0;
}
理论上来说,调用函数newA(a)会利用构造函数构造一个新的b对象,实际上呢?
我们看到,它调用的是拷贝构造函数。为什么?
不知道,我们就改动一下程序,直接查看b对象中a的值:
void newA(A b){cout<<b.a<<endl;}
奇怪了,我们明明没有对b初始化,它却生成了b=100。是这样么?当然不是。
我们传的参数是a,而a已经被初始化为100。这时候形参是 A b = a 的。是不是看出点东西了。
所以,在调用void newA(A b){}的时候,实际上是创造了一个形参,这个形参被拷贝构造函数初始化为已经被构造函数初始化的a初始化。说的别扭,就上图。
总结一下,什么时候调用拷贝构造函数?就是当使用“=”赋值的时候,需要用到拷贝构造函数。
关于深浅拷贝,请看:深拷贝与浅拷贝
参考资料:https://www.cnblogs.com/alantu2018/p/8459250.html
构造函数与拷贝构造函数相关推荐
- 不存在从void转换到sqlist的适当构造函数_拷贝构造函数与赋值构造函数
拷贝构造函数与赋值构造函数 在C++中,如果要创建一个新的类,并用已有的类来给它附初值.就要用到拷贝构造函数,拷贝构造函数又分为两种. 1.合成的拷贝构造函数 在你没有定义自己的拷贝构造函数而又调用了 ...
- String 的普通构造函数、拷贝构造函数、析构函数、赋值函数
转自:http://blog.csdn.net/xiaoxiangzhu660810/article/details/8149398 题目:编写类String的构造函数.析构函数和赋值函数,已知类St ...
- C++ : 构造函数,拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符应用场景
构造函数,拷贝构造函数,移动构造函数,拷贝赋值运算符,移动赋值运算符应用场景 #include <iostream> using namespace std;class Construct ...
- 构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序
构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 对象是由"底层向上"开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达 ...
- 默认构造函数和拷贝构造函数
构造函数 构造函数包括默认构造函数.拷贝构造函数和一般构造函数. 在编程时,如果程序员不显式声明和定义上述函数,编译器将自动产生4个public inline的默认函数. A(); ...
- 构造函数,拷贝构造函数,赋值函数
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个 ...
- 类string的构造函数、拷贝构造函数和析构函数
原文:http://www.cnblogs.com/Laokong-ServiceStation/archive/2011/04/19/2020402.html 类string的构造函数.拷贝构造函数 ...
- 构造函数、拷贝构造函数、赋值函数和析构函数
文章目录 一.构造函数 1.认识构造函数 2.初始化列表 二.拷贝构造函数 1.类对象的拷贝 2.浅拷贝和深拷贝 三.赋值函数 四.析构函数 1.认识析构函数 2.销毁,清理? 3.析构函数来阻止该类 ...
- 移动构造函数和拷贝构造函数的区别
讲讲移动构造函数与拷贝构造函数的区别 :移动构造函数是c++11的新特性,移动构造函数传入的参数是一个右值 用&&标出.一般来说左值可以通过使用std:move方法强制转换为右值.首先 ...
- C++ 构造函数、复制构造函数,拷贝构造函数(深拷贝、浅拷贝)
文章目录 前言 一.什么是构造函数? 二.构造函数的分类 复制构造函数 复制构造函数被调用的三种情况 复制构造函数在以下三种情况下会被调用. 三.拷贝构造函数的分类 深.浅拷贝构造函数的区别 示例代码 ...
最新文章
- 手机号码归属地及运营商查询
- Java NIO ———— Buffer 缓冲区详解
- 微型计算机接口与技术期末,微机原理与接口技术期末考试试题及答案.pdf
- 〖谷腾读书会GTC〗Digital economy
- Android--从零开始开发一款文章阅读APP
- 解决开机后自动重起问题
- java输入年月判断当月天数_java输入月份,年份,显示对应月份的天数,
- CUDA ---- GPU架构(Fermi、Kepler)
- azure kinect三维点云_三维重建技术,你捋清楚了吗?本文适合小白
- HTML5期末大作业:仿天猫购物网站设计——仿天猫购物商城(7页) 网页设计作业,网页制作作业, 学生网页作业, 网页作业成品, 网页作业模板
- 施耐德驱动器维修ELAU控制器维修C400C600
- 论文笔记:2018 PRCV 顶会顶刊墙展
- lamp平台构建和phpMyAdmin工具
- rtf转换成html,转换Rtf到HTML
- 话说嵌入式软件工程师的工资待遇
- 关于floor函数与ceil函数与round函数
- Android开发:设置背景图片
- video标签无法播放视频
- 两种最为常用的数据挖掘方法论
- 鸿蒙大陆罪恶深渊哪里出,罪恶深渊 - 音阙诗听 - 5SING中国原创音乐基地