第18课 - 对象的构造(中)

第18课 - 对象的构造(中)

1. 构造函数详解

  函数头的三大元素:int  func(para1, para2, ...) 返回值类型、函数名、参数。构造函数的返回值类型(无)、函数名(类名)都已确定,那参数能不能由程序员自定义呢?

1.1 带有参数的构造函数

  (1)构造函数可以根据需要定义参数,这些参数用于对象的初始化     【意义:使每个对象具有不同的初始化状态】

  (2)一个类中可以存在多个重载的构造函数

  (3)构造函数的重载遵循 C++ 重载的规则

Tips:对象定义对象声明的不同

  (1)对象定义:申请对象的空间并调用构造函数

  (2)对象声明:告诉编译器存在这样一个对象

  

1.2 构造函数的自动调用

  当创建对象时,构造函数会被自动调用。

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

1.3 构造函数的手动调用

  (1)一般情况下,构造函数在对象定义时自动被调用

  (2)一些特殊情况下,需要手工调用构造函数  

  思考:如何创建一个对象数组?  【希望在创建对象数组后,对每个对象进行不同的初始化,就需要手工调用构造函数】

 1 #include <stdio.h>
 2 
 3 class Test
 4 {
 5 private:
 6     int m_value;
 7 public:
 8     Test()
 9     {
10         printf("Test()\n");
11         
12         m_value = 0;    
13     }
14     Test(int val)
15     {
16         printf("Test(int val), val = %d\n", val);
17         
18         m_value = val;
19     }
20     
21     int getValue() { return m_value; }
22 };
23 
24 int main(void)
25 {
26     // Test ta[3];
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\n", i, ta[i].getValue());
33     }
34     
35     Test t = Test(100);
36 
37         printf("t.getValue() = %d\n", t.getValue());
38     
39     return 0;
40 }
构造函数的手动调用

2. 小实例

  需求:开发一个数组类解决原生数组的安全性问题

  (1)提供函数获取数组长度

  (2)提供函数获取数组元素

  (3)提供函数设置数组元素

 1 #ifndef _INTARRAY_
 2 #define _INTARRAY_
 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
IntArray.h
 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 
45 void IntArray::free()
46 {
47     delete[]m_pointer;
48 }
IntArray.cpp
 1 #include <stdio.h>
 2 #include "IntArray.h"
 3 
 4 int main(void)
 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\n", i, value);
20         }
21     }
22     
23     a.free();
24    
25     return 0;
26 }
27 
28  
main.cpp

3. 小结

  (1)构造函数可以根据需要定义参数

  (2)构造函数之间可以存在重载关系

  (3)构造函数遵循 C++ 中重载函数的规则

  (4)对象定义时会触发构造函数的调用

  (5)在一些情况下可以手动调用构造函数

 

posted @ 2017-07-24 14:39  Hengs  阅读(179)  评论(0编辑  收藏  举报