第18课 对象的构造(中)

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第18课 对象的构造(中)相关的知识,希望对你有一定的参考价值。

构造函数:

技术分享图片

 

 

构造函数带参数的意义就是可以使得每个对象有不同的初始化状态。

友情提醒:

技术分享图片

 

示例:

技术分享图片

 

 1 #include <stdio.h>
 2 
 3 class Test
 4 {
 5 public:
 6     Test() 
 7     { 
 8         printf("Test()
");
 9     }
10     Test(int v) 
11     { 
12         printf("Test(int v), v = %d
", v);
13     }
14 };
15 
16 int main()
17 {
18     Test t;      // 调用 Test()
19     Test t1(1);  // 调用 Test(int v)
20     Test t2 = 2; // 调用 Test(int v)
21     
22     int i(100);
23     
24     printf("i = %d
", i);
25     
26     return 0;
27 }

19、20行都叫做对象的初始化,对象从无到有都叫做初始化,初始化的时候会调用构造函数。初始化和赋值是不同的,int i = 0是初始化, i = 1是赋值。赋值和初始化在C语言中的差距不大,但是在面向对象的语言中差距很大,因为初始化要调用构造函数。

第22行是变量的初始化。

结果如下:

技术分享图片

 

编译器根据构造函数的参数来匹配具体的构造函数,这就是重载规则。

 

构造函数的调用:

技术分享图片

 

 

构造函数的手动调用示例:

技术分享图片

18行定义了类对象数组,可以看到构造函数调用了三次。

如果我们想让数组中的每个对象的初始值不一样怎么办呢?

这就需要手工调用构造函数。

 1 #include <stdio.h>
 2 
 3 class Test
 4 {
 5 private:
 6     int m_value;
 7 public:
 8     Test() 
 9     { 
10         printf("Test()
");
11         
12         m_value = 0;
13     }
14     Test(int v) 
15     { 
16         printf("Test(int v), v = %d
", v);
17         
18         m_value = v;
19     }
20     int getValue()
21     {
22         return m_value;
23     }
24 };
25 
26 int main()
27 {
28     Test ta[3] = {Test(), Test(1), Test(2)};      
29     
30     for(int i=0; i<3; i++)
31     {
32         printf("ta[%d].getValue() = %d
", i , ta[i].getValue());
33     }
34     
35     Test t = Test(100);
36     
37     printf("t.getValue() = %d
", t.getValue());
38     
39     return 0;
40 }

 第28行是关键所在,这就会调用不同的构造函数了。

35行的Test(100)就是手工调用构造函数的方式。

运行结果如下:

技术分享图片

 小实例:

技术分享图片

 

数组类的实现:

 1 #ifndef _INTARRAY_H_
 2 #define _INTARRAY_H_
 3 
 4 class IntArray
 5 {
 6 private:
 7     int m_length;
 8     int* m_pointer;
 9 public:
10     IntArray(int len);
11     int length();
12     bool get(int index, int& value);
13     bool set(int index ,int value);
14     void free();
15 };
16 
17 #endif
 1 #include "IntArray.h"
 2 
 3 IntArray::IntArray(int len)
 4 {
 5     m_pointer = new int[len];
 6     
 7     for(int i=0; i<len; i++)
 8     {
 9         m_pointer[i] = 0;
10     }
11     
12     m_length = len;
13 }
14 
15 int IntArray::length()
16 {
17     return m_length;
18 }
19 
20 bool IntArray::get(int index, int& value)
21 {
22     bool ret = (0 <= index) && (index < length());
23     
24     if( ret )
25     {
26         value = m_pointer[index];
27     }
28     
29     return ret;
30 }
31 
32 bool IntArray::set(int index, int value)
33 {
34     bool ret = (0 <= index) && (index < length());
35     
36     if( ret )
37     {
38         m_pointer[index] = value;
39     }
40     
41     return ret;
42 }
43 
44 void IntArray::free()
45 {
46     delete[]m_pointer;
47 }

主程序如下:

 1 #include <stdio.h>
 2 #include "IntArray.h"
 3 
 4 int main()
 5 {
 6     IntArray a(5);    
 7     
 8     for(int i=0; i<a.length(); i++)
 9     {
10         a.set(i, i + 1);
11     }
12     
13     for(int i=0; i<a.length(); i++)
14     {
15         int value = 0;
16         
17         if( a.get(i, value) )
18         {
19             printf("a[%d] = %d
", i, value);
20         }
21     }
22     
23     a.free();
24     
25     return 0;
26 }

运行结果如下:

技术分享图片

 

小结:

技术分享图片

 

以上是关于第18课 对象的构造(中)的主要内容,如果未能解决你的问题,请参考以下文章

第19课 对象的构造(下)

第19课 - 对象的构造(下)

第17课 - 对象的构造

第21课 - 对象的构造顺序

第21课对象的构造顺序

C++--第16课 - 继承中的构造与析构