13.1——复制构造函数,赋值操作符,析构函数
2015-08-30 17:09
260 查看
如果没有显式的定义复制构造函数和赋值操作符以及析构函数,编译器会为我们定义。
复制构造函数:
(1)是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。
(2)当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数。
(3)当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式的使用复制构造函数。
析构函数:
(1)是构造函数的互补,当对象超过了作用域,或动态分配的对象被删除时,将自动的应用析构函数。
(2)析构函数释放对象构造时所获取的资源。
(3)无论是否定义了析构函数,编译器都自动的执行类中非static数据成员的析构函数。
赋值操作符:
(1)赋值操作符可以通过指定不同类型的右操作数而重载。
13.1 复制构造函数
具有单个形参,该形参(常用const修饰)是对该类类型的引用。
复制构造函数可用于:
(1)根据另一个同类型的对象显式的或隐式的初始化一个对象
(2)复制一个对象,将它作为实参传给一个函数
(3)从函数返回复制一个对象
(4)初始化顺序容器中的元素
(5)根据元素初始化列表初始化数组元素
1. 对象的定义形式
(1)复制初始化用=
复制初始化首先使用指定的构造函数创建一各临时对象,再然后用复制构造函数将那个对象复制给正在创建的对象。
对于类对象只有指定单个实参或者显式创建一个临时对象用于复制时,才使用复制初始化。
(2)直接初始化用(),将初始化式放在圆括号中
直接初始化直接调用与实参匹配的构造函数。
2. 形参与返回值
(1)当形参为非引用类型时,将复制实参的值
(2)当函数的返回类型非引用时,将返回return值的副本(调用复制构造函数)
3. 初始化容器的元素
(1)复制构造函数可以用来初始化容器中的元素
vector<string> vec(5)先调用string的默认构造函数创建string对象,再调用string的复制构造函数将对象赋值到vec的每个元素。
4. 构造函数与数组元素
使用常规的{}来括住数组的初始化列表时,先创建好了临时对象后,调用复制构造函数复制给每个对应元素
13.1.1 合成的复制构造函数
(1)如果没有定义复制构造函数,那么编译器会为我们合成一个复制构造函数
(2)即使我们定义了其它的构造函数,也会合成复制构造函数
(3)执行逐个的成员初始化
逐个成员:编译器将现有对象的每个非static成员,依次复制到正在创建的对象
内置类型直接复制
类型对象调用复制构造函数
13.1.2 定义自己的复制构造函数 foo(const foo&);
(1)一般形参设置为const的引用
为什么有些类需要定义自己的复制构造函数
(1)有些类必须对复制对象时发生的事情加以控制
(2)这样的类经常有数据成员是指针,或者在构造函数中分配有其他的资源
13.1.3 禁止复制
(1)为了防止复制可以将复制函数定义为私有的
(2)将其为私有时,类的成员和类的对象仍可以进行调用
(3)大多数的类应该定义复制构造函数
13.2 赋值操作符
(1)如果类没有定义自己的赋值操作符,则编译器会合成一个,operator=的函数,可以对赋值进行定义
(2)合成赋值操作符,会执行逐个成员赋值。
(3)复制和赋值常在一起使用,如果需要其中一个,那么也几乎可以肯定需要另外一个
13.3 析构函数
完成资源的回收,作为构造函数的补充
1. 何时调用析构函数
(1)撤销对象时会自动调用析构函数
(2)当对象的引用或指针超出作用域时,不会调用析构函数
(3)删除指向动态内存分配对象的指针时会调用析构函数
(4)实际的对象(而不是引用)超出作用域时才会调用析构函数
2. 如果需要析构函数,那么也需要赋值操作符合复制构造函数
3. 合成构造函数
(1)按对象创建时,逆序的撤销每个非static成员
(2)
复制构造函数:
(1)是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。
(2)当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式的使用复制构造函数。
(3)当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式的使用复制构造函数。
析构函数:
(1)是构造函数的互补,当对象超过了作用域,或动态分配的对象被删除时,将自动的应用析构函数。
(2)析构函数释放对象构造时所获取的资源。
(3)无论是否定义了析构函数,编译器都自动的执行类中非static数据成员的析构函数。
赋值操作符:
(1)赋值操作符可以通过指定不同类型的右操作数而重载。
13.1 复制构造函数
具有单个形参,该形参(常用const修饰)是对该类类型的引用。
复制构造函数可用于:
(1)根据另一个同类型的对象显式的或隐式的初始化一个对象
(2)复制一个对象,将它作为实参传给一个函数
(3)从函数返回复制一个对象
(4)初始化顺序容器中的元素
(5)根据元素初始化列表初始化数组元素
1. 对象的定义形式
(1)复制初始化用=
复制初始化首先使用指定的构造函数创建一各临时对象,再然后用复制构造函数将那个对象复制给正在创建的对象。
对于类对象只有指定单个实参或者显式创建一个临时对象用于复制时,才使用复制初始化。
(2)直接初始化用(),将初始化式放在圆括号中
直接初始化直接调用与实参匹配的构造函数。
2. 形参与返回值
(1)当形参为非引用类型时,将复制实参的值
(2)当函数的返回类型非引用时,将返回return值的副本(调用复制构造函数)
3. 初始化容器的元素
(1)复制构造函数可以用来初始化容器中的元素
vector<string> vec(5)先调用string的默认构造函数创建string对象,再调用string的复制构造函数将对象赋值到vec的每个元素。
4. 构造函数与数组元素
使用常规的{}来括住数组的初始化列表时,先创建好了临时对象后,调用复制构造函数复制给每个对应元素
13.1.1 合成的复制构造函数
(1)如果没有定义复制构造函数,那么编译器会为我们合成一个复制构造函数
(2)即使我们定义了其它的构造函数,也会合成复制构造函数
(3)执行逐个的成员初始化
逐个成员:编译器将现有对象的每个非static成员,依次复制到正在创建的对象
内置类型直接复制
类型对象调用复制构造函数
13.1.2 定义自己的复制构造函数 foo(const foo&);
(1)一般形参设置为const的引用
为什么有些类需要定义自己的复制构造函数
(1)有些类必须对复制对象时发生的事情加以控制
(2)这样的类经常有数据成员是指针,或者在构造函数中分配有其他的资源
13.1.3 禁止复制
(1)为了防止复制可以将复制函数定义为私有的
(2)将其为私有时,类的成员和类的对象仍可以进行调用
(3)大多数的类应该定义复制构造函数
13.2 赋值操作符
(1)如果类没有定义自己的赋值操作符,则编译器会合成一个,operator=的函数,可以对赋值进行定义
(2)合成赋值操作符,会执行逐个成员赋值。
(3)复制和赋值常在一起使用,如果需要其中一个,那么也几乎可以肯定需要另外一个
13.3 析构函数
完成资源的回收,作为构造函数的补充
1. 何时调用析构函数
(1)撤销对象时会自动调用析构函数
(2)当对象的引用或指针超出作用域时,不会调用析构函数
(3)删除指向动态内存分配对象的指针时会调用析构函数
(4)实际的对象(而不是引用)超出作用域时才会调用析构函数
2. 如果需要析构函数,那么也需要赋值操作符合复制构造函数
3. 合成构造函数
(1)按对象创建时,逆序的撤销每个非static成员
(2)
相关文章推荐
- 一个简单的python练习
- 集合框架知识点总结(一)
- 运算符重载函数作为类成员函数和友元函数
- RequestDispatcher
- android Bitmap内存优化(二) 多线程下载图片
- 解决下载乱码问题
- 兔子问题(斐波那契数列)
- 点阵字模显示
- 图像分割——掩膜法
- C语言中的文本流与二进制流的区别
- 嘤嘤嘤.....我要面试!!!【SQL数据库方面】
- 关于项目架构资料整理
- SimpleAdapter适配的ListView(不常用)
- 第一个android客户端笔记
- HDU——2010水仙花数
- STL源码剖析 [容器](十二)[RB_Tree]
- linux-samba服务搭建
- .NET程序的性能要领和优化建议
- 创建安卓桌面快捷图标
- TestLink基本流程