复制控制:复制构造函数 赋值操作符 以及 析构函数(智能
2009-12-04 21:16
387 查看
这篇日志主要关注对象的复制控制!这篇好好组织一下吧。
复制控制包括:复制构造函数,析构函数,以及赋值操作符
1. 复制构造函数
(1)什么时候会调用?
显式或隐式两种调用。
当定义一个新对象并用一个同类型的对象对它进行初始化时,显示使用复制构造函数
当该类型的对象传递给函数或从函数返回该类型的对象时,隐式调用。
(2)具体用到的地方?
初始化对象,传参,函数返回值,初始化容器元素,初始化数组元素
<1>初始化对象。分为直接式和复制式两种:
string str("test")
string str = "test“
第一种是直接式,第二种是复制式。复制式时,编译器首先调用一个C 风格字符串形参的string构造函数,创建一个临时对象,然后调用string的复制构造函数将str初始化为临时对象。
<2>形参和返回值
这个没什么好说的,C系列只要不是引用传参,都会复制实参给形参的(包括指针也复制的),所以这里会调用复制构造函数。
<3>初始化容器
这个看例子,我对容器还不是很了解,不敢说太多。
vevtor<string> svec(5)
编译器首先使用string的默认构造函数创建一个临时值来初始化svec,然后使用复制构造函数将临时值复制到svec的每个元素。
<4>数组元素
当对类数组使用花括号的初始化列表的初始化形式时,会调用复制构造函数对数组元素进行初始化。
(3)系统自动生成的复制构造函数
其实有许多错误不是因为系统不作为,而是因为系统做太多。关键它做了没跟你打声招呼。
如果你没有定义复制构造函数,那么系统会为你自动生成一个。
他会对现有对象的每个非static成员,依次复制到正创建的对象。
对内置类型,复制值,对类成员,则调用类对象的复制构造函数,数组成员也将复制到一个新的数组中。
(目前我没有试验过,但是感觉这个有点深克隆的感觉啊,我的意思是如果类成员是 非指针的类类型的时候,如 Class1 mClass1. 如果是指针肯定是浅克隆了。Java因为全部都是指针啊,所以不定义就肯定是浅克隆 )
(4)禁止复制
禁止复制有两种方法,将复制构造函数定义为Private,这样系统也不会帮你生成了。
或者在复制构造函数前面加explicit关键字,表示一定要显示调用,那么就不会出现上面说的隐式调用的情况了。
(写的好累)还有别的事情 先switch一下。
复制控制包括:复制构造函数,析构函数,以及赋值操作符
1. 复制构造函数
(1)什么时候会调用?
显式或隐式两种调用。
当定义一个新对象并用一个同类型的对象对它进行初始化时,显示使用复制构造函数
当该类型的对象传递给函数或从函数返回该类型的对象时,隐式调用。
(2)具体用到的地方?
初始化对象,传参,函数返回值,初始化容器元素,初始化数组元素
<1>初始化对象。分为直接式和复制式两种:
string str("test")
string str = "test“
第一种是直接式,第二种是复制式。复制式时,编译器首先调用一个C 风格字符串形参的string构造函数,创建一个临时对象,然后调用string的复制构造函数将str初始化为临时对象。
<2>形参和返回值
这个没什么好说的,C系列只要不是引用传参,都会复制实参给形参的(包括指针也复制的),所以这里会调用复制构造函数。
<3>初始化容器
这个看例子,我对容器还不是很了解,不敢说太多。
vevtor<string> svec(5)
编译器首先使用string的默认构造函数创建一个临时值来初始化svec,然后使用复制构造函数将临时值复制到svec的每个元素。
<4>数组元素
当对类数组使用花括号的初始化列表的初始化形式时,会调用复制构造函数对数组元素进行初始化。
(3)系统自动生成的复制构造函数
其实有许多错误不是因为系统不作为,而是因为系统做太多。关键它做了没跟你打声招呼。
如果你没有定义复制构造函数,那么系统会为你自动生成一个。
他会对现有对象的每个非static成员,依次复制到正创建的对象。
对内置类型,复制值,对类成员,则调用类对象的复制构造函数,数组成员也将复制到一个新的数组中。
(目前我没有试验过,但是感觉这个有点深克隆的感觉啊,我的意思是如果类成员是 非指针的类类型的时候,如 Class1 mClass1. 如果是指针肯定是浅克隆了。Java因为全部都是指针啊,所以不定义就肯定是浅克隆 )
(4)禁止复制
禁止复制有两种方法,将复制构造函数定义为Private,这样系统也不会帮你生成了。
或者在复制构造函数前面加explicit关键字,表示一定要显示调用,那么就不会出现上面说的隐式调用的情况了。
(写的好累)还有别的事情 先switch一下。
相关文章推荐
- 构造函数以及复制控制操作的调用时机
- C++语法基础--复制控制--复制构造函数 ,赋值操作符 ,析构函数
- 析构函数、复制构造函数,operator=以及深拷贝浅拷贝问题
- C++中struct也有构造函数与析构函数,也可以有访问类型控制以及结构体大小,类大小
- 字符串类的实现:构造函数、析构函数、复制构造函数和赋值操作符
- 复制控制:复制构造函数、赋值操作符、析构函数
- C++ 第13章 复制控制---复制构造函数、赋值操作符、析构函数
- 第13章 复制控制 (part1) 复制构造函数 & 赋值操作符 & 析构函数
- C++中struct也有构造函数与析构函数,也可以有访问类型控制以及结构体大小,类大小
- 第十二章-----第十三章 构造函数 复制构造函数 赋值操作符析构函数 static类成员
- 对象初始化以及在构造函数和析构函数中调用virtual函数的问题
- 智能指针:复制控制!《C++Primer 》第13章学习纪要
- C++复制控制:赋值操作符和析构函数
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
- 类中的构造函数,析构函数,复制构造函数,赋值函数
- C++ Primer 面向对象编程 15.3 基类派生类相互转换 15.4. 构造函数和复制控制
- Effective c++(笔记) 中关于构造函数、析构函数以及赋值操作符的知识
- C++继承中析构函数 构造函数的调用顺序以及虚析构函数
- C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容 【转】 参考度4.6星
- 关于默认构造函数、复制构造函数、析构函数、赋值操作的各种测试探索