The Big –Three ---
构造函数,析构函数,赋值函数
构造函数、析构函数与赋值函数是每个类最基本的函数。
对于任意一个类
A,如果不想编写上述函数,
C++编译器将自动为
A 产生四个缺省的函数,如
A(void); // 缺省的无参数构造函数
A(const A &a); // 缺省的拷贝构造函数
~A(void); // 缺省的析构函数
A & operate =(const A &a); // 缺省的赋值函数
,既然能自动生成函数,为什么还要程序员编写?
原因如下:
(
1)如果使用“缺省的无参数构造函数”和“缺省的析构函数”,等于放弃了自主“初
始化”和“清除”的机会,C++发明人Stroustrup 的好心好意白费了。
(
2)“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”
的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。
“对于那些没有吃够苦头的
C++程序员,如果他说编写构造函数、析构函数与赋值函
数很容易,可以不用动脑筋,表明他的认识还比较肤浅,水平有待于提高。“
存在继承关系的The Big Three
构造函数---
子类的构造函数初始化列表中要对父类构造函数进行初始化
析构函数---
父类的析构函数加 virtual
赋值---
???
在编写派生类的赋值函数时,注意不要忘记对基类的数据成员重新赋值。例如:
class Base
{
public:
…
Base & operate =(const Base &other); // 类Base 的赋值函数
private:
int m_i, m_j, m_k;
};
class Derived : public Base
{
public:
…
Derived & operate =(const Derived &other); // 类Derived 的赋值函数
private:
int m_x, m_y, m_z;
};
Derived & Derived::operate =(const Derived &other)
{
//(1)检查自赋值
if(this == &other)
return *this;
//(2)对基类的数据成员重新赋值
Base::operate =(other); // 因为不能直接操作私有数据成员
//(3)对派生类的数据成员赋值
m_x = other.m_x;
m_y = other.m_y;
m_z = other.m_z;
//(4)返回本对象的引用
return *this;
}