构造函数定义:构造函数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 }