第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() "); 9 } 10 11 Test(int v) 12 { 13 printf("Test(int v), v = %d ", 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 ", 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() "); 11 12 m_value = 0; 13 } 14 Test(int val) 15 { 16 printf("Test(int val), val = %d ", 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 ", i, ta[i].getValue()); 33 } 34 35 Test t = Test(100); 36 37 printf("t.getValue() = %d ", 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
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 }
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 ", i, value); 20 } 21 } 22 23 a.free(); 24 25 return 0; 26 } 27 28
3. 小结
(1)构造函数可以根据需要定义参数
(2)构造函数之间可以存在重载关系
(3)构造函数遵循 C++ 中重载函数的规则
(4)对象定义时会触发构造函数的调用
(5)在一些情况下可以手动调用构造函数