問題:
オブジェクトが作成されると、メンバ変数の初期値はどのくらいですか?
プログラム設計の観点から、唯一の変数をターゲット従って、:
-にスタック上のオブジェクトを作成し、初期のメンバー変数ランダム値
に- ヒープオブジェクトを作成するために、初期のメンバー変数のランダムな値を
-でオブジェクトを静的な記憶領域を作成するのメンバーを変数0の初期値
オブジェクトが生活している初期化後にリストされている(例えば、携帯電話)
、初期状態(工場出荷時設定)広範な状態の対象となる
問題:
オブジェクトを初期化するにはどのようにプログラム?
一般的に、オブジェクトは、必要特定の初期状態を
ソリューション
オプション1:
-クラスの初期化に公共機能を提供
- オブジェクトが作成されるとすぐに初期化関数を呼び出して初期化するために
、次のようにコードを:
1つの#include <stdio.hの>
2
3 級試験
4 {
5 プライベート:
6 INT I。
7 int型J;
8 公共:
9 INT GETI(){ リターンI。}
10 INT getJ(){ 戻りJ。}
11 ボイド初期化()
12 {
13 、I = 1 。
14 J = 2 。
15 }
16 }。
17
18 試験GT。
19
20 のint main()の
21 {
22 gt.initialize()。
23
24 のprintf(" gt.i =%d個の\ n " 、gt.getI())。
25 のprintf(" gt.j =%d個の\ n " 、gt.getJ())。
26
27 テストT1。
28
29 t1.initialize()。
30
31 のprintf(" t1.i =%d個の\ n " 、t1.getI())。
32 のprintf(" t1.j =%d個の\ n " 、t1.getJ())。
33
34 // t1.initialize()。
35
36 試験*のPT = 新しいテスト。
37
38 PT-> )(初期化します。
39
40 のprintf(" PT-> I =%d個の\ n "、PT-> GETI());
41 のprintf(" PT-> J =%d個の\ n "、PT-> getJ());
42
43 PTを削除します。
44
45 戻り 0 ;
46 }
この方法は、上記の要件を満たすことができますが、問題があるが。
オブジェクトが作成された後、それを初期化するための即時の呼び出しがない場合は()関数は、何が起こるのだろうか?
上記のコード、ノートライン29はライン34が開き、ビットを実験現象を見て、実行することができます。
t1のオブジェクト、そのメンバ変数i、jはランダムな値です。
这种解决方案,虽然在一定程度上解决问题,但是它并不完美。既然是对象创建后就必须调用的函数,为什么initialize函数必须手工调用呢?如果是人手工调用的话,就有可能出错。要么忘记了调用,要么调用的顺序不对。所以,应该有一个大胆的想法,这个initialize函数能不能自动调用?
于是就诞生了构造函数。
C++中可以定义与类名相同的特殊成员函数
-这种特殊的成员函数叫做构造函数
构造函数没有任何返回类型的声明
构造函数在对象定义时自动被调用
1 #include <stdio.h>
2
3 class Test
4 {
5 private:
6 int i;
7 int j;
8 public:
9 int getI() { return i; }
10 int getJ() { return j; }
11 Test()
12 {
13 printf("Test() Begin\n");
14
15 i = 1;
16 j = 2;
17
18 printf("Test() End\n");
19 }
20 };
21
22 Test gt;
23
24 int main()
25 {
26 printf("gt.i = %d\n", gt.getI());
27 printf("gt.j = %d\n", gt.getJ());
28
29 Test t1;
30
31 printf("t1.i = %d\n", t1.getI());
32 printf("t1.j = %d\n", t1.getJ());
33
34 Test* pt = new Test;
35
36 printf("pt->i = %d\n", pt->getI());
37 printf("pt->j = %d\n", pt->getJ());
38
39 delete pt;
40
41 return 0;
42 }
对象创建后,构造函数就会被立即的调用执行。那么调用是谁来做的呢?
编译器在编译程序时,它会敏感的发现程序中定义了构造函数,于是在创建对象的地方帮我们自动的调用了构造函数。
小结:
每个对象在使用之前都应该初始化
类的构造函数用于对象的初始化
构造函数与类同名并且没有返回值
构造函数在对象定义时自动被调用