构造函数和析构函数
1、构造函数
a、C++中与类名相同的成员函数叫构造函数
b、定义时可以有参数
c、没有任何返回类型的声明(void也没有)
d、自动调用和手动调用
2、析构函数
a、清理对象的特殊成员函数,语法:~ClassName()
b、没有参数,没有任何类型的返回类型的声明
c、对象被销毁时自动被调用
3、构造函数的分类
1 //有参数构造函数的三种调用方法 2 class Test 3 { 4 private: 5 int a; 6 int b; 7 8 public: 9 10 //无参数构造函数 --》调用:Test t1; 11 Test() 12 { 13 ; 14 } 15 16 //带参数的构造函数 -->调用:Test t1(1,2) 17 Test(int a, int b) 18 { 19 ; 20 } 21 //赋值构造函数 -->手动调用:Test t1 = Test(1, 2) 匿名对象 22 Test(const Test &obj) 23 { 24 ; 25 } 26 27 public: 28 void init(int _a, int _b) 29 { 30 a = _a; 31 b = _b; 32 } 33 };
4、copy构造函数4种调用场景
1 2 //第一种: 3 AA a1; //变量定义 4 5 //赋值构造函数的第一个应用场景 6 //用对象1 初始化 对象2 7 AA a2 = a1; //定义变量并初始化 //初始化法 8 9 第二种: 10 11 AA a1(10); //变量定义 12 13 //赋值构造函数的第一个应用场景 14 //用对象1 初始化 对象2 15 AA a2(a1); //定义变量并初始化 //括号法 16 17 18 第三种: 19 20 #include "iostream" 21 using namespace std; 22 23 class Location 24 { 25 public: 26 Location( int xx = 0 , int yy = 0 ) 27 { 28 X = xx ; Y = yy ; cout << "Constructor Object.\n" ; 29 } 30 Location( const Location & p ) //复制构造函数 31 { 32 X = p.X ; Y = p.Y ; cout << "Copy_constructor called." << endl ; 33 } 34 ~Location() 35 { 36 cout << X << "," << Y << " Object destroyed." << endl ; 37 } 38 int GetX () { return X ; } int GetY () { return Y ; } 39 private : int X , Y ; 40 } ; 41 42 // 43 void f ( Location p ) 44 { 45 cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ; 46 } 47 48 void mainobjplay() 49 { 50 Location A ( 1, 2 ) ; //形参是一个元素,函数调用,会执行实参变量初始化形参变量 51 f ( A ) ; 52 } 53 54 void main() 55 { 56 mainobjplay(); 57 system("pause"); 58 } 59 60 第四种: 61 62 第四个应用场景 63 #include "iostream" 64 using namespace std; 65 class Location 66 { 67 public: 68 Location( int xx = 0 , int yy = 0 ) 69 { 70 X = xx ; Y = yy ; cout << "Constructor Object.\n" ; 71 } 72 Location( const Location & p ) //复制构造函数 73 { 74 X = p.X ; Y = p.Y ; cout << "Copy_constructor called." << endl ; 75 } 76 ~Location() 77 { 78 cout << X << "," << Y << " Object destroyed." << endl ; 79 } 80 int GetX () { return X ; } int GetY () { return Y ; } 81 private : int X , Y ; 82 } ; 83 84 //alt + f8 排版 85 void f ( Location p ) 86 { 87 cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ; 88 } 89 90 Location g() 91 { 92 Location A(1, 2); 93 return A; 94 } 95 96 //对象初始化操作 和 =等号操作 是两个不同的概念 97 //匿名对象的去和留,关键看,返回时如何接 98 void mainobjplay() 99 { 100 //若返回的匿名对象,赋值给另外一个同类型的对象,那么匿名对象会被析构 101 //Location B; 102 //B = g(); //用匿名对象 赋值 给B对象,然后匿名对象析构 103 104 //若返回的匿名对象,来初始化另外一个同类型的对象,那么匿名对象会直接转成新的对象 105 Location B = g(); 106 107 } 108 109 void main() 110 { 111 mainobjplay(); 112 system("pause"); 113 } 114 115
5、对象初始化列表
a、原因:如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,
没有默认构造函数。这时要对这个类成员进行初始化,就必须调用这个类成员的带参数的构造函数,
如果没有初始化列表,那么他将无法完成第一步,就会报错。
1 #include "iostream" 2 using namespace std; 3 4 class ABC 5 { 6 public: 7 ABC(int a, int b, int c) 8 { 9 this->a = a; 10 this->b = b; 11 this->c = c; 12 printf("a:%d,b:%d,c:%d \n", a, b, c); 13 printf("ABC construct ..\n"); 14 } 15 ~ABC() 16 { 17 printf("a:%d,b:%d,c:%d \n", a, b, c); 18 printf("~ABC() ..\n"); 19 } 20 protected: 21 private: 22 int a; 23 int b; 24 int c; 25 }; 26 27 28 class MyD 29 { 30 public: 31 MyD():abc1(1,2,3),abc2(4,5,6),m(100)//调用的顺序与定义时的顺序有关系 32 //MyD() 33 { 34 cout<<"MyD()"<<endl; 35 } 36 ~MyD() 37 { 38 cout<<"~MyD()"<<endl; 39 } 40 41 protected: 42 private: 43 ABC abc1; //c++编译器不知道如何构造abc1 44 ABC abc2; 45 const int m; 46 }; 47 48 49 int run() 50 { 51 MyD myD; 52 return 0; 53 } 54 55 int main_dem03() 56 { 57 58 run(); 59 system("pause"); 60 return 0; 61 }