第18課構造函數(中)

帶有參數構造函數(可使每一個對象有不一樣的初始化狀態)
  構造函數能夠根據須要定義參數
  一個類中能夠存在多個重載的構造函數
  構造函數的重載遵循C++重載的規則
class Test
{
public:
  Test(int v)
  {
    //use v to initialize member
  }
}編程

友情提示
對象定義和對象聲明不一樣
  對象定義——申請對象的空間調用構造函數
  對象聲明——告訴編譯器存在這樣一個對象
  數組

  Test t; //定義對象並調用構造函數安全

int main()
{
  //告訴編譯器存在名爲t 的Test對象
  extern Test t;

  return 0;
}函數

 

構造函數的自動調用
class Test
{
public:
  Test() {   }
  Test(int v) {   }

};學習

int main
{
  Test t;           //調用Test()
  Test t1(1);    //調用Test(int v)
  Test t2 = 1;  //調用Test(int v)

  return 0;
}
Test t1(1)解析:
定義一個Test 對象,名字爲t1。圓括號裏面有個當即數1,看上去很像函數調用。其實它用來告訴編譯器
要調用帶有參數的構造函數,調用哪一個帶有參數的構造函數呢?這時候就須要利用重載的規則了。
當即數1的類型爲int,因此就告訴編譯器所要調用的構造函數,它只有一個參數,而且參數的類型爲int.在這個地方就是Test(int v)spa

 1 #include <stdio.h>
 2 
 3 class Test  4 {  5 public:  6  Test()  7  {  8         printf("Test()\n");  9  } 10     Test(int v) 11  { 12         printf("Test(int v), v = %d\n", 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); //用100來初始化i。至關於int i =100; 23     
24     printf("i = %d\n", i); 25     
26     return 0; 27 }

注意:
Test t2 = 2; //用2來初始化t2
int i = 1; //用1對變量就進行初始化code

i = 2; //用2對變量i進行賦值
之前在學習C語言時,初始化和賦值好像沒有什麼差異,因而就將賦值和初始化混淆了。
在C語言中,二者貌似差距很小。可是在C++中,二者之間的差別很大。緣由是初始化會調用構造函數。對象

必定要記住,初始化會調用構造函數,賦值時調用的就不是構造函數了。賦值的時候究竟發生了什麼?之後再說。blog

 

構造函數的調用
-通常狀況下,構造函數在對象定義時被自動調用
-一些特殊狀況下,須要手工調用構造函數
如何建立一個對象數組?
編程實驗:構造函數的手動調用開發

 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 v) 15  { 16         printf("Test(int v), v = %d\n", 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\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 }

需求:開發一個數組類解決原生數組的安全性問題
-提供函數獲取數組長度
-提供函數獲取數組元素
-提供函數設置數組元素

IntArray.h

 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

IntArray.cpp

 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 }

main.cpp

#include <stdio.h> #include "IntArray.h"

int main() { IntArray a(5); for(int i=0; i<a.length(); i++) { a.set(i, i + 1); } for(int i=0; i<a.length(); i++) { int value = 0; if( a.get(i, value) ) { printf("a[%d] = %d\n", i, value); } } a.free(); return 0; }

小結:

構造函數能夠根據須要定義參數
構造函數之間能夠存在重載關係
構造函數遵循C++中重載函數的規則
對象定義時會觸發構造函數的調用
在一些狀況下能夠手動調用構造函數

相關文章
相關標籤/搜索