c++Primer,十三,复制控制
来源:互联网 发布:python可以跨平台吗 编辑:程序博客网 时间:2024/04/28 23:38
第十三章 复制控制
当定义一个新类型的时候,需要显式或隐式地指定复制、赋值和撤销该类型的对象时会发生什么——这是通过定义特殊成员:复制构造函数、赋值操作符和析构函数来达到的。如果没有显式定义复制构造函数或赋值操作符,编译器(通常)会为我们定义。
这些就是这章要说的:复制控制。
复制构造函数:是一种特殊构造函数,具有单个形参,该形参(常用 const 修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式使用复制构造函数。当将该类型的对象传递给函数或函数返回该类型的对象时,将隐式使用复制构造函数。
回忆一下,C++ 支持两种初始化形式(第 2.3.3 节):直接初始化和复制初始化。复制初始化使用 = 符号,而直接初始化将初始化式放在圆括号中。当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象。
赋值操作符:与构造函数一样,赋值操作符可以通过指定不同类型的右操作数而重载。右操作数为类类型的版本比较特殊:如果我们没有编写这种版本,编译器将为我们合成一个。至于重载操作符,在下一章会提出这个概念。
重载操作符是一些函数,其名字为 operator 后跟着所定义的操作符的符号。因此,通过定义名为 operator= 的函数,我们可以对赋值进行定义。像任何其他函数一样,操作符函数有一个返回值和一个形参表。形参表必须具有与该操作符数目相同的形参(如果操作符是一个类成员,则包括隐式 this 形参)。赋值是二元运算,所以该操作符函数有两个形参:第一个形参对应着左操作数,第二个形参对应右操作数。大多数操作符可以定义为成员函数或非成员函数。当操作符为成员函数时,它的第一个操作数隐式绑定到 this 指针。有些操作符(包括赋值操作符)必须是定义自己的类的成员。因为赋值必须是类的成员,所以 this 绑定到指向左操作数的指针。
析构函数:是构造函数的互补,当对象超出作用域或动态分配的对象被删除时,将自动应用析构函数。析构函数可用于释放对象时构造或在对象的生命期中所获取的资源。不管类是否定义了自己的析构函数,编译器都自动执行类中非static 数据成员的析构函数。
动态分配的对象只有在指向该对象的指针被删除时才撤销。如果没有删除指向动态对象的指针,则不会运行该对象的析构函数,对象就一直存在,从而导致内存泄漏,而且,对象内部使用的任何资源也不会释放。当对象的引用或指针超出作用域时,不会运行析构函数。只有删除指向动态分配对象的指针或实际对象(而不是对象的引用)超出作用域时,才会运行析构函数。
析构函数是个成员函数,它的名字是在类名字之前加上一个代字号(~),它没有返回值,没有形参。因为不能指定任何形参,所以不能重载析构函数。虽然可以为一个类定义多个构造函数,但只能提供一个析构函数,应用于类的所有对象。析构函数与复制构造函数或赋值操作符之间的一个重要区别是,即使我们编写了自己的析构函数,用于释放自己创建的动态内存,合成析构函数仍然运行,用来撤销类的成员。
复制构造函数、赋值操作符和析构函数总称为复制控制。编译器自动实现这些操作,但类也可以定义自己的版本。
后面两节,其中一个是个例子,另外一个是关于管理指针的,因为c++需要自己控制内存,用到指针的地方就要涉及指针指向的对象的内存释放问题,所以用起来要注意点,在实际运用中,多看工程性的代码,学习如何高效智能的管理代码。
基本上这章不去深入了解也可以,如果你对c++感兴趣的话,可以多学学,我只是想入门c++,所以大多数都是错略的看看。
- c++Primer,十三,复制控制
- C++ Primer(十三) 复制控制
- 《C++Primer》 3.14 复制控制
- C++ Primer 学习笔记十三 —— 复制控制
- c++primer 复制控制-消息处理示例
- 复制控制(学习<C++Primer>)
- 《c++primer》读书笔记二 复制控制
- [C/C++] 第13章 复制控制 primer
- [C++ Primer] 复制控制
- C++ Primer 复制控制
- C++Primer读书笔记(十三)
- primer 复制控制 智能指针
- C++ Primer(复制控制)
- C++ primer(十四) 复制控制
- C++学习笔记十三-复制控制
- C++primer(十三) 拷贝函数(续)
- C Primer Plus学习 十三 逻辑运算
- C++Primer学习笔记第十三章(13/18)类 复制控制
- 各种距离
- 一段github上的一段py 使用iplist.net去反查域名,看看到底有多少个域名指向了一个IP
- 基础知识查漏补缺
- 我的读书笔记--关于java分布式应用
- JavaScript绑定事件的几种方法
- c++Primer,十三,复制控制
- 关于printf("%p",p);使用方法的一些总结
- 扩展gcd模板,a^x=b。
- 对于java表达式中存在的陷阱的一些总结(基于java程序员的基本修养)
- Xcode 工程文件打开不出来, cannot be opened because the project
- len()函数 的常见错误
- rpm 搭建和配置vsftpd服务
- CentOS下查看修改mysql编码方式
- Java基础复习——数据类型