一、赋值操作符

类定义了该类型对象赋值时会发生什么。与拷贝构造函数一样,如果类没有定义自己的赋值操作符,编译器会合成一个。

1、重载操作符的简单介绍

重载操作符是一些函数,其名字为operator后跟着所定义的操作符的符号,通过定义名为operator=的函数,我们可以对赋值进行定义。操作符函数的形参表必须具有与该操作数数目相同的形参(如果操作符是一个成员,则包括隐式this形参)。赋值是二元操作符,对应的两个形参,第一个形参为左操作数,第二个形参为右操作数。

注意:

(1)当操作符为成员函数时,它的第一个操作数隐式绑定到this指针。

(2)有些操作符,例如赋值操作符必须定义为成员函数,因此赋值操作符可接受单个形参。

(3)赋值操作符返回对右操作数的引用。

2、合成赋值操作符

合成赋值操作符会执行逐个成员赋值:右操作数对象的每个成员赋值为左操作数对象的对应成员。对于数组,给每个数组元素赋值。

Sales_item& Sales_item::Sales_item(const Sales_item &rhs)
{
isbn = rhs.isbn;
units_sold = rhs.units_sold;
revenue = rhs.revenue;
return *this; //返回对左操作数的引用
}

3、拷贝和赋值常一起使用

可以使用拷贝构造函数的类通常也可使用合成赋值操作符。一般而言,如果类需要拷贝构造函数,它也会需要赋值操作符。应将两者看作一个单元,如果需要其中一个,我们几乎也肯定需要另一个。

二、析构函数

析构函数的作用是完成所需资源的回收,作为类构造函数的补充。

1、何时调用析构函数

撤销类对象时自动调用析构函数:

(1)变量在超出作用域时自动撤销。例如:变量item遇到右}时。

(2)动态分配的对象只有在指向该对象的指针被删除时才撤销。例如:指针p。

Sales_item *p = new Sales_item;
{
Sales_item item(*p);
delete p;
}

注意:当对象的引用或指针超出作用域时,不会运行析构函数。只有删除指向动态分配对象的指针或实际对象(而不是对象的引用)超出作用域时,才会运行析构函数。

(3)撤销一个容器(不管是标准库还是内置数组)也会运行容器中元素的析构函数。

容器中的元素总是按逆序撤销,首先撤销下标为size()-1的元素,最后撤销下标为0的元素。

{
Sales_item *p = new Sales_item[];
vector<Sales_item> vec(p, p + );
delete [] p;
}

2、何时编写显式析构函数

许多类不需要显式析构函数,具有构造函数的类不一定需要定义自己的析构函数,仅在有些工作需要析构函数完成时,才需要析构函数。析构函数通常用于释放在构造函数或在对象生命期内获取的资源。

注意:

(1)如果类需要析构函数,则它也需要赋值操作符和拷贝构造函数,这是一个有用的经验法则。

(2)析构函数并不仅限于用来释放资源。一般而言,析构函数可以执行任意操作,该操作是类设计者希望在该类对象的使用完毕之后执行的。

3、合成析构函数

与拷贝构造函数和赋值操作符不同,编译器总会为我们合成一个析构函数。合成析构函数按对象创建时的逆序撤销每个非static成员,按成员在类中声明的逆序撤销成员。对于类类型的每个成员,合成析构函数调用该成员的析构函数撤销对象。

注意:撤销内置类型成员或复合类型成员没什么影响,合成析构函数并不删除指针成员做指向的对象。

4、编写析构函数

析构函数的名字前加~,没有返回值,没有形参(所以不能重载析构函数)。

注意:

(1)类可以定义多个构造函数,但只能提供一个析构函数,应用于类的所有对象。

(2)析构函数区别于拷贝构造函数和赋值操作符,即使定义了自己的析构函数,合成析构函数仍然运行。

class Sales_item
{
public:
~Sales_item(){}
private:
string isbn;
int units_sold;
double revenue;
};

撤销Sales_item对象时,首先运行这个什么都不做的析构函数,然后再运行合成析构函数撤销类的成员。

C++复制控制:赋值操作符和析构函数的更多相关文章

  1. C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

    在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过: ...

  2. C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容

    一.本文目的与说明 1. 本文目的:理清在各种继承时,构造函数.复制构造函数.赋值操作符.析构函数的执行顺序和执行内容. 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的 ...

  3. 析构函数-复制构造函数-赋值操作符重载-默认构造函数<代码解析>

    通过下面primer中的一道习题,可以更深刻的了解,析构函数,复制构造函数,赋值操作符重载,默认构造函数的使用. 但是我的结果与primer习题解答里面的并不相同,可能是编译器不同的原因导致. // ...

  4. 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结

    转自 http://www.jb51.net/article/37527.htm,感谢作者 #include "stdafx.h"      #include <iostre ...

  5. 赋值操作符、复制构造函数、析构函数、static成员练习

    /** * 定义一个Employee类,包含雇员名字和一个唯一的雇员标识,为该类定义默认构造函数和参数为表示 * 雇员名字的string构造函数.如果该类需要复制构造函数或赋值操作符,实现这些函数 * ...

  6. c++ 构造函数,拷贝构造函数,析构函数与赋值操作符

    题目: 为下面的Rectangle类实现构造函数,拷贝构造函数,赋值操作符,析构函数. class Shape { int no; }; class Point { int x; int y; }; ...

  7. C++ 复制控制之复制构造函数

    7月26日更新: 过了这么长的时间回过头来看,发现文章中有几个点说错(用红字标出): 构造函数不是只有唯一一个参数,它也可以是多参数形式,其第二参数及后继以一个默认值供应. 不是没有声明复制控制函数时 ...

  8. C++ Primer 随笔 Chapter 13 复制控制

    1.复制控制包含的内容:复制构造函数.赋值操作符.析构函数 2.复制构造函数: a. 定义:只有单个形参,而且该形参是对本类类型的引用,这样的构造函数被成为复制构造函数 b. 适用情况: (1)根据一 ...

  9. 稍微深入点理解C++复制控制【转】

    通过一个实例稍微深入理解C++复制控制过程,参考资料<C++ primer>,介绍点基本知识: 1.在C++中类通过特殊的成员函数:复制构造函数.赋值操作符和析构函数来控制复制.赋值和撤销 ...

随机推荐

  1. windows7上安装php7和apche2.4

    windows7在配置php7+apache2.4 1.下载并安装vc14http://www.microsoft.com/zh-cn/download/details.aspx?id=48145下载 ...

  2. 20145316《Java程序设计》第十周学习总结

    学习内容总结 网络编程 1.网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据. 2.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴. 3.在发 ...

  3. Ubuntu 16.04 安装Postman

    Ubuntu 16.04 安装Postman: 1.官网下载地址:https://www.getpostman.com/根据机器类型选择64位下载. 2.进入下载目录,解压该文件sudo tar -x ...

  4. mysql-community-server安装完后不知道root密码

    修改方法: service mysqld stop mysqld_safe --skip-grant-tables & mysql -u root use mysql; update user ...

  5. 20135302魏静静——linux课程第八周实验及总结

    linux课程第八周实验及总结 实验及学习总结 1. 进程切换在内核中的实现 linux中进程切换是很常见的一个操作,而这个操作是在内核中实现的. 实现的时机有以下三个时机: 中断处理过程(包括时钟中 ...

  6. 通过Excel生成批量SQL语句

    项目中有时会遇到这样的要求:用户给发过来一些数据,要我们直接给存放到数据库里面,有的是Insert,有的是Update等等,少量的数据我们可以采取最原始的办法,也就是在SQL里面用Insert int ...

  7. 如何使用JMX监控Kafka

    使用kafka做消息队列中间件时,为了实时监控其性能时,免不了要使用jmx调取kafka broker的内部数据,不管是自己重新做一个kafka集群的监控系统,还是使用一些开源的产品,比如yahoo的 ...

  8. Linux后台运行命令,nohup和&的区别

    &的意思是在后台运行, 什么意思呢?  意思是说, 当你在执行 ./a.out & 的时候, 即使你用ctrl C,  那么a.out照样运行(因为对SIGINT信号免疫). 但是要注 ...

  9. java中把指数形式的数字转为正常形式显示

    /** * 当浮点型数据位数超过10位之后,数据变成科学计数法显示.用此方法可以使其正常显示. * @param value * @return Sting */ public static Stri ...

  10. Spring MVC web.xml+servlet.xml

    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " ...