构造函数constructor 与析构函数destructor(一)

构造函数定义:构造函数c++中在创建对象时自动调用,用来初始化对象的特殊函数。

(1)构造函数的名字必须与类的名字相同,不能有返回值,哪怕是void 也不行。

(2)通常情况下构造函数应声明为公有函数,否则它不能像其他成员函数那样被显式地调用 构造函数被声明为私有有特殊的用途,这个以后再写。

(3)但是可以有参数,因为有参数,故可以被重载。

 1 #ifndef TEST_H
 2 #define TEST_H
 3 class Test{
 4     int m_i;
 5 public:
 6     Test(int i=0);
 7     Test(int i,char c);//构造函数被重载
 8     void fun();
 9     void fun(int i=0);//普通函数被重载,不过这种重载会有问题,当在函数中以fun()这种形式调用fun函数时,连接器就不知道链接哪一个具体的fun了。
10 
11 };
12 #endif //TEST_H

(4)不带参数的构造函数 或者所有的参数都有默认值的构造函数,成为默认构造函数,默认构造函数只能有一个,如果默认构造函数既包含不带参数的,也包含所有参数都有默认值的,那么编译器就会报错。

 1 #ifndef TEST_H
 2 #define TEST_H
 3 class Test{
 4     int m_i;
 5 public:
 6     Test(int i=0);
 7         Test();//类中有两个默认构造函数
 8 
 9 };
10 #endif //TEST_H

(5)如果程序中未声明任何构造函数,则系统自动产生出一个默认构造函数,但是只要程序员自己生命了一个构造函数,编译器就不会再生产默认构造函数。

(6)构造函数和delete:可以在堆中用new operator 分配一个对象的空间,这种分配的对象空间要由程序员自己释放,用delete,在new时调用constructor 在delete时调用destructor。

 1 #ifndef TEST_H
 2 #define TEST_H
 3 class Test{
 4     int m_i;
 5 public:
 6     Test(int i = 0){};
 7     Test(int i, char c){};
 8 
 9 };
10 #endif //TEST_H
11 
12 int main(){
13 
14     Test* tp = new Test();//调用constructor
15     delete tp;//调用destructor
16     return 0;
17 }

(7)一般的局部类对象的初始化顺序,即构造函数被调用的顺序,一般语气定义的顺序一样,释放的顺序,即析构函数被调用的顺序,一般与构造函数调用的顺序相反。

(8)全局对象的构造函数在主函数main之前被调用,在main函数结束时,析构函数被调用

(9)构造函数和数组

#ifndef TEST_H
#define TEST_H
class Test{
    int m_i;
public:
    Test(int i = 0){}
    Test(int i, char c){}
    ~Test(){}

};
#endif //TEST_H

int main(){

    Test* tp=Test[2];//创建一个Test对象的数组,被tp指针指向。
         delete [] tp;//删除指向数组的指针,一定要加[]。
    return 0;
}

析构函数的定义:析构函数是c++中的类对象生存期结束时,被调用用来释放对象空间的特殊函数,也是自动调用的。

(1)析构函数的名字在类名前加一个~符号

(2)析构函数不能有返回值,也不能有参数,因此不可以重载

(3)析构函数可以被显示的调用,构造函数不行

 1 #ifndef TEST_H
 2 #define TEST_H
 3 class Test{
 4     int m_i;
 5 public:
 6     Test(int i = 0){}
 7     Test(int i, char c){}
 8     ~Test(){}
 9 
10 };
11 #endif //TEST_H
12 
13 int main(){
14 
15     Test* tp = new Test();
16     tp->~Test();//显示调用析构函数
17     delete tp;
18     return 0;
19 }
原文地址:https://www.cnblogs.com/cplinux/p/5615980.html