在编写C++程序的时候,我们会为特定某一类对象申明类类型,几乎我们申明的每一个class都会有一个或多个构造函数、一个析构函数、一个赋值运算符重载=、以及拷贝构造函数。这些函数控制着类对象的基础操作,确保新定义的对象的初始化、完成对象撤销时的清理工作、赋予对象新值。如果这些函数的操作出错,则会导致严重的后果,所以确保这些函数的操作行为正常是非常重要的。
一、编译器默认生成的函数
如果我们编写一个空类,编译器会为我们默认生成构造函数、析构函数、赋值运算符、拷贝构造函数。
例如当我们定义
class Empty{ };
就好像我们写下了如下代码(红色是编译器默认生成)
class Empty{
public:
Empty(){....} //默认构造函数
Empty(const Empty &rhs){....} //默认拷贝构造函数
~Empty(){....} //默认析构构造函数
Empty& operator=(const Empty &rhs){....} //赋值运算符
Empty* operator&(){...} //取地址运算符
const Empty* operator&() const{...} //取地址运算法的const版本
};
1. 说明:(1)这些函数只有在被调用的时候,才会被编译器创建出来;
(2)四个函数都public且inline的;
(3)如果显示的定义了其中某一个函数,那么编译器就不会生成其对应的默认的版本;
(4)自定义的拷贝构造函数不仅会覆盖默认的拷贝构造函数,同时也会覆盖默认的构造函数,下面的函数class构造函数,不能通过编译
1 #include <iostream> 2 using namespace std; 3 class Empty 4 { 5 public: 6 Empty(const Empty &Copy){}; 7 }; 8 int main(int argc, char** argv) 9 { 10 Empty a; 11 return 0; 12 } View Code
2. 实例:
下面的代码会让编译器创建默认的构造函数 Empty e1; //默认构造函数
Empty e2(e1);//拷贝构造函数
e2 = e1;//赋值运算符
1 #include <iostream> 2 using namespace std; 3 4 class Empty{ 5 6 public: 7 Empty(){cout << "create" << endl;} 8 Empty(const Empty &Copy){ cout << "copy" << endl;} 9 Empty& operator=(const Empty &Assig){cout << "assign=" << 10 endl;} 11 Empty* operator&(){cout << "&" << endl;} 12 const Empty* operator&() const {cout << "&1" << endl;} 13 ~Empty(){cout << "delete" << endl;} 14 }; 15 int main() 16 { 17 Empty *e = new Empty(); // create 18 delete e; //delete 19 Empty e0; //create 20 const Empty e1; //create 21 Empty e2(e1); //copy 22 Empty e3; //create 23 e3 = e1;//assign= 24 cout << &e0 << endl;//& 0x602080 25 const Empty *p = &e1;//&1 26 cout << p << endl; //0x602080 27 return 0; 28 } 29 //e0,e1,e2,e3对象被撤销时候删除 30 delete 31 delete 32 delete 33 delete
View Code二、构造函数
1. 构造函数的作用