1,物件的構造通過建構函式來完成,和類名相同且沒有返回值,這個時候只有參 數乙個特性,建構函式可以自定義引數,這個引數一般而言就是對類進行初始 化來使用的;帶有引數的建構函式的意義在於可以使得每個物件有不同的初始 化狀態(生活中每個事物必然包含自己的初始化狀態,不如人的出生,面向對 象用來將生活中的事物對映的程式設計領域,所以現實世界的情況都必須可以 用物件導向的語言來描述,因此帶有引數的建構函式就是非常必要的);
2,帶有引數的建構函式:
1,建構函式可以根據需要定義引數;
2,乙個類中可以存在多個過載的建構函式;
3,建構函式的過載遵循 c++ 過載的規則;
4,**示例:
1class
test28
};
3,物件定義和物件宣告的區別:
1,物件定義:申請物件的空間並呼叫建構函式;
1,第一步,必須申請物件所占用的記憶體空間;
2,第二步,呼叫建構函式;
2,物件宣告:告訴編譯器存在這樣乙個物件;
1,物件在**定義的不知道,鏈結的時候回去找;
2,預處理,編譯器對源**進行檢查並生成目標檔案,鏈結器在各個目標檔案中尋找目標檔案存在的一些名字;
3,物件宣告時,沒有物件定義時的兩個步驟;
3,**示例:
1 test t; //定義物件並呼叫建構函式;23
int main()
4
4,物件的宣告中可以在構造函式引數中給出預設值,物件的定義中不能夠在構 造函式引數中給出預設值;
4,建構函式的自動呼叫(第一種初始化物件方式):
1 #include 23class
test410
11 test(int
v) 12
15};
1617
intmain()
18
1,實驗結果說明:
1,初始化和賦值看上去相同之處在於當初始化用賦值符號表達的時候;
2,不同之處在於初始化要呼叫建構函式,而賦值不會;
5,建構函式的呼叫:
1,一般情況下,建構函式在物件定義時被自動呼叫;
2,一些特殊情況下,需要手工呼叫建構函式:
1,如何建立物件陣列;
6,建構函式的手工呼叫(第二種初始化物件方式)程式設計實驗:
1 #include 23class
test
414 test(int
v) 15
20int
getvalue()
2124
};25
26int
main()
2734
35 test ta[3] = ; //
手動呼叫建構函式;
3637
for(int i=0; i<3; i++) //
迴圈結果為 0 1 2;分別呼叫了相應的建構函式;
3841
42 test t = test(100); //
初始化第二種方式,手工呼叫建構函式;
4344 printf("
t.getvalue() = %d\n
", t.getvalue());
4546
return0;
47 }
7,小例項:
1,需求:開發乙個陣列類解決原生陣列的安全性問題:
1,提供函式獲取陣列長度;
1,c++ 要相容 c 語言中的陣列,但是 c 語言中的陣列沒有長度資訊,用著用著就越界了;
2,提供函式獲取陣列元素;
3,提供函式設定陣列元素;
8,陣列類的實現程式設計實驗:
1,intarray.h 檔案:
1#ifndef _intarray_h_
2#define _intarray_h_34
class
intarray5;
1617
#endif
2,intarray.cpp 檔案:
1 #include "intarray.h"2
3 intarray::intarray(int len) //
不加作用域分辨符時,是全域性函式(此時僅名字字首相同而已),所以要加作用域分辨符指明是陣列類中的函式;411
12 m_length =len;13}
1415
intintarray::length()
1619
20bool intarray::get(int index, int&value)
2128
29return ret; //
越界則返回 false;30}
3132
bool intarray::set(int index, int
value)
3340
41return
ret;42}
4344
void intarray::free
()45
3,intarray 的使用:
1 #include 2 #include "intarray.h"3
4int
main()512
13for(int i=0; i)
1421}22
23 a.free
();24
25return0;
26 }
4,這裡展示了物件導向的強大,我們可以通過類來封裝一些之前學習到的概念,並且可以將這些概念上的缺陷通過封裝來彌補開來;
9,小結:
1,建構函式可以根據需要定義引數;
2,建構函式之間可以存在過載關係;
3,建構函式遵循 c++ 中過載函式的規則;
4,物件定義時會觸發建構函式的呼叫;
1,構造函式呼叫方式分為自動呼叫和手工呼叫兩種;
2,自動呼叫的形式又分為引數式和賦值式;
3,即初始化時,分為兩種呼叫方式三種書寫形式;
5,在一些情況下可以手動呼叫建構函式;
C 中構造函式呼叫建構函式
include include using namespace std struct cls cls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體 非靜態資料成員是未初始化的 2 ...
C 中構造函式呼叫建構函式
include stdlib.h include iostream using namespace std struct clscls int main 列印結果是不定的,不一定為0 奇怪的地方在於建構函式中呼叫了自己的另乙個建構函式 我們知道,當定義乙個物件時,會按順序做2件事情 1 分配好記憶體...
c 中構造函式呼叫建構函式
c 中建構函式完成的工作分兩步 1 分配空間 2 初始化空間 構造函式呼叫建構函式。class a a int a private int a 這樣會導致,a 中先分配了空間,然後呼叫a 0 又建立了乙個臨時物件,然後初始化為0,而原物件則沒有初始化。這種問題在類中有指標需要分配空間時會導致災難。從...