C++构造函数/析构函数/赋值函数

在编写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. 构造函数的作用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b07621f91a28989cad46eeac8c702217.html