一、赋值操作符 类定义了该类型对象赋值时会发生什么。与拷贝构造函数一样,如果类没有定义自己的赋值操作符,编译器会合成一个。 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[10];
vector<Sales_item> vec(p, p + 10);
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++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htm
将C语言梳理一下,分布在以下10个章节中:- Linux-C成长之路(一):Linux下C编程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
- Linux-C成长之路(二):基本数据类型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
- Linux-C成长之路(三):基本IO函数操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
- Linux-C成长之路(四):运算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
- Linux-C成长之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
- Linux-C成长之路(六):函数要义 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
- Linux-C成长之路(七):数组与指针 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
- Linux-C成长之路(八):存储类,动态内存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
- Linux-C成长之路(九):复合数据类型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
- Linux-C成长之路(十):其他高级议题
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-02/113818.htm