帶有參數的構造函數(可使每一個對象有不一樣的初始化狀態)
構造函數能夠根據須要定義參數
一個類中能夠存在多個重載的構造函數
構造函數的重載遵循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++中重載函數的規則
對象定義時會觸發構造函數的調用
在一些狀況下能夠手動調用構造函數