C++ 类构造函数和析构函数

  • 类构造函数

    类构造函数是类的特殊成员函数,只要我们创建该类的新对象,该构造函数便会自动执行。构造函数将具有与类完全相同的名称,并且根本没有任何返回类型,甚至没有void。构造函数对于为某些成员变量设置初始值非常有用。以下示例解释了构造函数的概念-
    
    #include <iostream>
     
    using namespace std;
     
    class Line {
       public:
          void setLength( double len );
          double getLength( void );
          Line();  // This is the constructor
       private:
          double length;
    };
     
    // Member functions definitions including constructor
    Line::Line(void) {
       cout << "Object is being created" << endl;
    }
    void Line::setLength( double len ) {
       length = len;
    }
    double Line::getLength( void ) {
       return length;
    }
    
    // Main function for the program
    int main() {
       Line line;
     
       // set line length
       line.setLength(6.0); 
       cout << "Length of line : " << line.getLength() << endl;
     
       return 0;
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Object is being created
    Length of line : 6
    
  • 构造函数参数

    默认构造函数没有任何参数,但是如果需要,构造函数可以具有参数。这有助于您在创建对象时为对象分配初始值,如以下示例所示-
    
    #include <iostream>
     
    using namespace std;
    class Line {
       public:
          void setLength( double len );
          double getLength( void );
          Line(double len);  // This is the constructor
     
       private:
          double length;
    };
     
    // Member functions definitions including constructor
    Line::Line( double len) {
       cout << "Object is being created, length = " << len << endl;
       length = len;
    }
    void Line::setLength( double len ) {
       length = len;
    }
    double Line::getLength( void ) {
       return length;
    }
    
    // Main function for the program
    int main() {
       Line line(10.0);
     
       // get initially set length.
       cout << "Length of line : " << line.getLength() << endl;
       
       // set line length again
       line.setLength(6.0); 
       cout << "Length of line : " << line.getLength() << endl;
     
       return 0;
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Object is being created, length = 10
    Length of line : 10
    Length of line : 6
    
  • 使用初始化列表初始化字段

    如果使用参数化构造函数,则可以使用以下语法初始化字段-
    
    Line::Line( double len): length(len) {
       cout << "Object is being created, length = " << len << endl;
    }
    
    上面的语法等于下面的语法-
    
    Line::Line( double len) {
       cout << "Object is being created, length = " << len << endl;
       length = len;
    }
    
    尝试一下
    如果对于C类,您有多个字段X,Y,Z等要初始化,则可以使用相同的语法并以逗号分隔字段,如下所示-
    
    C::C( double a, double b, double c): X(a), Y(b), Z(c) {
       ....
    }
    
  • 类析构函数

    析构函数是类的特殊成员函数,每当其类的对象超出作用域或将delete表达式应用于该类的对象的指针时,都执行该析构函数。析构函数的名称与以波浪号(~)为前缀的类的名称完全相同,并且既不能返回值,也不能采用任何参数。析构函数对于在程序退出之前释放资源非常有用,例如关闭文件,释放内存等。以下示例解释了析构函数的概念-
    
    #include <iostream>
     
    using namespace std;
    class Line {
       public:
          void setLength( double len );
          double getLength( void );
          Line();   // This is the constructor declaration
          ~Line();  // This is the destructor: declaration
     
       private:
          double length;
    };
     
    // Member functions definitions including constructor
    Line::Line(void) {
       cout << "Object is being created" << endl;
    }
    Line::~Line(void) {
       cout << "Object is being deleted" << endl;
    }
    void Line::setLength( double len ) {
       length = len;
    }
    double Line::getLength( void ) {
       return length;
    }
    
    // Main function for the program
    int main() {
       Line line;
     
       // set line length
       line.setLength(6.0); 
       cout << "Length of line : " << line.getLength() << endl;
     
       return 0;
    }
    
    尝试一下
    上面的代码编译并执行后,返回以下结果-
    
    Object is being created
    Length of line : 6
    Object is being deleted