C++复制控制
来源:互联网 发布:mysql数据库放在哪里 编辑:程序博客网 时间:2024/06/03 19:21
复制控制:当定义一个新的类型的时候,需要显示和隐式地指定复制,赋值和撤销该类型的对象时会发生什么,
这是通过定义特殊成员:复制构造函数,赋值操作符和析构函数来达到的。
复制构造函数(copy constructor ):是一种特殊的函数,具有单个形参,该形参(常用const)是对
该类型的引用.当定义一个新对象时并用一个同类型的对象对他进行初始化时,将显示使用复制构造函数.
当将该类型的对象传递给函数或冲函数返回该类型的对象时,将隐式使用复制构造函数.
赋值操作符(=):与构造函数一样,赋值操作符可以通过指定不同类型的右操作数而重载。右操作数为类类型的版本比较特殊:
如果我们没有编写这样的版本,那么编译器将为我们合成一个。
复制构造函数,赋值操作符和析构函数总称为复制控制(copy control ).编译器自动实现这些操作,但是类也可以定义自己的版本
通常,编译器合成的复制控制是非常精炼的-------他们只做必要的工作。但是对某些类而言,依赖于默认的定义
会导致灾难。实现复制控制操作最困难的部分,往往在于识别何时需要覆盖默认的版本.有一种特别常见的情况需要
类定义自己的复制控制成员的:类具有指针的成员
一.复制构造函数
1.对象的定义形式
cpp支持两种初始化形式:直接初始化和复制初始化。复制初始化调用=符号,而直接初始化将初始化式放在圆括号中.
当用于类类型对象时,初始化的复制形式和直接初始化有所不同:直接初始化自己接调用与形参匹配的构造函数.
复制初始化总是调用复制构初始化总是调用复制构造函数。复制初始化式首先使用指定构造函数创建一个临时对象
然后用复制构造函数将那个临时对象复制到正在创建的对象。
string null_book = "99999" ; // copy-initialization
string dots(10,'.') ; // direct-initialization
string empty_copy = string() ; // copy-initializaton
string empty_direct ; // direct-initialization
null_book对象定义时将直接调用string类的复制构造函数,即拷贝构造函数
dots对象定义时直接调用对应的构造函数
empty_copy对象定义时先调用string的默认构造函数生成一个临时的对象,然后通过拷贝构造函数将其复制到empty_copy中
empty对象定义时直接调用默认的构造函数
2.形参与返回值
当形参为非引用类型的时候,将复制实参的值。类似地,以非引用类型作返回值时将返回return 语句中的值的副本.
当形参或返回值为类类型时,由复制构造函数进行复制
3.初始化容器元素
复制构造函数可用于初始化顺序容器中的元素。例如,可以用表示容量的单个形参来初始化容器.
容器的这种构造方式使用了默认构造函数和复制构造函数
vector<string> svec(5) ;
编译器首先使用string 的默认构造函数创建一个临时值来初始化svec,然后使用复制构造函数将临时值复制到
svec的每一个元素。
二.赋值操作符
1.与类要控制初始化对象的方式一样,类页定义了该类型对象复制时会发生什么。
与复制构造函数一样,如果程序没有定义自己的赋值操作符,编译器会生成一个默认的。
2.一般而言,如果类需要复制构造函数,他也会需要赋值操作符。实际上应将两个操作符看成是一个单元,如果需要其中一个
我们几乎可以肯定需要另外一个。
三.析构函数
很多类不需要显式的析构函数,尤其是具有构造函数的类不一定需要定义自己的析构函数。仅在有些工作需要析构函数完成时,
才需要析构函数。析构函数通常用来释放在构造函数或在对象生命期内获取的资源.
如果类需要析构函数,则他也需要赋值操作符合复制构造函数,这是一个有用的经验法则。
析构函数并不仅限于释放资源。一般而言,析构函数可以执行任意操作,该操作是类设计者希望在该对象使用完毕后执行的操作
这是通过定义特殊成员:复制构造函数,赋值操作符和析构函数来达到的。
复制构造函数(copy constructor ):是一种特殊的函数,具有单个形参,该形参(常用const)是对
该类型的引用.当定义一个新对象时并用一个同类型的对象对他进行初始化时,将显示使用复制构造函数.
当将该类型的对象传递给函数或冲函数返回该类型的对象时,将隐式使用复制构造函数.
赋值操作符(=):与构造函数一样,赋值操作符可以通过指定不同类型的右操作数而重载。右操作数为类类型的版本比较特殊:
如果我们没有编写这样的版本,那么编译器将为我们合成一个。
复制构造函数,赋值操作符和析构函数总称为复制控制(copy control ).编译器自动实现这些操作,但是类也可以定义自己的版本
通常,编译器合成的复制控制是非常精炼的-------他们只做必要的工作。但是对某些类而言,依赖于默认的定义
会导致灾难。实现复制控制操作最困难的部分,往往在于识别何时需要覆盖默认的版本.有一种特别常见的情况需要
类定义自己的复制控制成员的:类具有指针的成员
一.复制构造函数
1.对象的定义形式
cpp支持两种初始化形式:直接初始化和复制初始化。复制初始化调用=符号,而直接初始化将初始化式放在圆括号中.
当用于类类型对象时,初始化的复制形式和直接初始化有所不同:直接初始化自己接调用与形参匹配的构造函数.
复制初始化总是调用复制构初始化总是调用复制构造函数。复制初始化式首先使用指定构造函数创建一个临时对象
然后用复制构造函数将那个临时对象复制到正在创建的对象。
string null_book = "99999" ; // copy-initialization
string dots(10,'.') ; // direct-initialization
string empty_copy = string() ; // copy-initializaton
string empty_direct ; // direct-initialization
null_book对象定义时将直接调用string类的复制构造函数,即拷贝构造函数
dots对象定义时直接调用对应的构造函数
empty_copy对象定义时先调用string的默认构造函数生成一个临时的对象,然后通过拷贝构造函数将其复制到empty_copy中
empty对象定义时直接调用默认的构造函数
2.形参与返回值
当形参为非引用类型的时候,将复制实参的值。类似地,以非引用类型作返回值时将返回return 语句中的值的副本.
当形参或返回值为类类型时,由复制构造函数进行复制
3.初始化容器元素
复制构造函数可用于初始化顺序容器中的元素。例如,可以用表示容量的单个形参来初始化容器.
容器的这种构造方式使用了默认构造函数和复制构造函数
vector<string> svec(5) ;
编译器首先使用string 的默认构造函数创建一个临时值来初始化svec,然后使用复制构造函数将临时值复制到
svec的每一个元素。
二.赋值操作符
1.与类要控制初始化对象的方式一样,类页定义了该类型对象复制时会发生什么。
与复制构造函数一样,如果程序没有定义自己的赋值操作符,编译器会生成一个默认的。
2.一般而言,如果类需要复制构造函数,他也会需要赋值操作符。实际上应将两个操作符看成是一个单元,如果需要其中一个
我们几乎可以肯定需要另外一个。
三.析构函数
很多类不需要显式的析构函数,尤其是具有构造函数的类不一定需要定义自己的析构函数。仅在有些工作需要析构函数完成时,
才需要析构函数。析构函数通常用来释放在构造函数或在对象生命期内获取的资源.
如果类需要析构函数,则他也需要赋值操作符合复制构造函数,这是一个有用的经验法则。
析构函数并不仅限于释放资源。一般而言,析构函数可以执行任意操作,该操作是类设计者希望在该对象使用完毕后执行的操作
- 《C++Primer》 3.14 复制控制
- c++Primer,十三,复制控制
- c++primer 复制控制-消息处理示例
- 复制控制(学习<C++Primer>)
- 《c++primer》读书笔记二 复制控制
- [C/C++] 第13章 复制控制 primer
- 复制控制
- 复制控制
- 复制控制
- 复制控制
- 复制控制
- 复制控制
- 复制控制
- 复制控制
- [C++] String类的复制控制的实现
- C++(30)构造函数和复制控制
- C++复制控制
- 13 复制控制 学习
- 多态处理实例变量与实例方法的差别
- 我爱天文 - 秋季有大三角吗?
- delphi取得汉字拼音
- 操作系统概念
- 浅谈C#中XML用法
- C++复制控制
- 从禁止复制的网页上复制信息
- Oracle日常性能查看
- 【wikioi】1018 单词接龙
- 数据库备份
- 打包成jar文件后运行出现Invalid or corrupt jarfile
- 制作自己的xmpp/gtalk客户端
- 【discuzx2】如何开启主题评价及帖子点评功能?
- 【数据结构之排序7】堆排序