复制控制
来源:互联网 发布:linux mint 安装vim 编辑:程序博客网 时间:2024/06/04 21:46
1、复制控制
每种类型定义了创建该类型对象时会发生什么的函数即:构造函数,同时类型还能控制复制、赋值或撤销该类型对象时会发生什么,这些是通过:复制构造函数、赋值构造函数和析构函数来控制这些行为的,三个函数总称为复制控制。
2、复制构造函数
(1)定义
只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为复制构造函数。如:
Sales_item::Sales_item(const Sales_item) : isbn(orig.isbn), units_sold(orig.units_sold),
revenue(orig.revenue)
{
}
(2)调用复制构造函数的情况
根据另一个同类型的对象显示或隐式初始化一个函数
作为实参传给一个函数
从函数返回一个该类型对象
初始化顺序容器中的元素
初始化数组中的元素
(3)c++支持的两种初始化形式
直接初始化,将初始化式放在圆括号中,它直接调用与实参匹配的构造函数。如:
string dots(10, '.');
string empty_direct;
复制初始化,使用“=”号初始化,它在初始化时,首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象。如:
string null_book = "9-999-99999-9";
string empty_copy = string();
(4)合成复制构造函数
如果我们没有定义复制构造函数,编译器就会为我们合成一个。与合成默认构造函数不同,即使我们定义了其他构造函数,也会合成复制构造函数。合成复制构造函数会执行逐个成员初始化,将新对象初始化为原对象的副本。有些类必须对复制对象时发生的事情加以控制,包括:数据成员是指针类型,或有成员在构造函数中分配的其他资源,必须在创建新对象时做一些特定工作的类。
(5)禁止复制
为了防止复制,类必须显示声明其复制构造函数为private,然而类的友元和成员仍可以复制,如果也将这两类函数禁止,就可以声明一个private复制构造函数但不对其定义。
3、赋值构造函数
(1)赋值构造函数
赋值是二元运算,所以有两个参数,第一个参数对应左操作数,第二参数对应右操作数,当操作符为成员函数时,它的第一个操作数绑定到this指针,右操作数一般为从const引用。如:
Sales_item& operator=(const Sales_item&);
(2)合成赋值操作符
执行逐个成员复制,除数组外,每个成员用所属类型的常规方式进行赋值,对于数组,给每个数组元素赋值。
4、析构函数
(1)何时调用
删除指定动态分配对象的指针或实际对象超出作用域时。
(2)何时编写显示析构函数
三法则:如果类需要析构函数,则它同时也需要赋值操作符和复制构造函数。
(3)合成析构函数
合成析构函数按照对象创建时的逆序撤销每个非static成员,对于类类型的每个成员,合成析构函数调用该成员的析构函数来撤销对象。合成析构函数并不删除指针成员所指向的对象。析构函数与其他复制控制函数的一个重要区别是:即使编写了自己的析构函数,合成析构函数仍然运行。
5、管理指针成员
(1)管理指针的方法
采取常规指针行为,具有指针的所有缺陷,无需任何复制控制。
采取“智能指针”行为,指针所指向的对象是共享的,但类能够防止悬垂指针。
类采取值型行为,指针所指向的对象是唯一的,由每个类对象独立管理。
(2)定义智能指针类
定义一个计数类,这个类保存了需要管理的指针成员,并且定义需要能够指示多少个对象共享指针的size_t类型即:使用计数,当使用计数为0时删除该对象。如果不为零当进行复制时要增加使用计数,另外计数类应该将原始类设置为友元,原始类中应含有计数类的指针成员,当原始类第一次创建时同时也要创建计数类。
- 复制控制
- 复制控制
- 复制控制
- 复制控制
- 复制控制
- 复制控制
- 复制控制
- 复制控制
- C++复制控制
- 13 复制控制 学习
- 关于复制控制
- C++类复制控制
- C++复制控制
- 第十三章 复制控制
- 复制控制和继承
- 第十三章:复制控制
- 复制控制和继承
- C++ 复制控制
- 在mini2440上运行QT4程序
- Android版本百度地图开发(五)——覆盖物
- orale 已存在的表和 SEQUENCE 查询和删除
- 使用指针忘记分配空间,导致WideCharToMultiByte崩溃
- 命令行添加PATH
- 复制控制
- 利用javaScript实现点击输入框弹出窗体选择信息
- java 连接SQL Server2000 最新驱动
- JQuery动画
- 为emacs添加scala语法支持
- 利用matlab如何在图形中绘制箭头
- MYSQL创建utf-8格式的数据库
- 电商第一站致力于电子商务职业经理人培养!
- java连接数据库