构造函数:
构造函数带参数的意义就是可以使得每个对象有不同的初始化状态。
友情提醒:
示例:
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 }
运行结果如下:
小结: