构造函数和析构函数

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 }

 

 

posted @ 2019-09-02 17:51  千小塔  阅读(230)  评论(0编辑  收藏  举报