好多bug由物件構造造成--------物件的構造與建構函式有關係
—c++中的類可以定義多個物件,那麼物件構造順序是怎樣的?
(1)對於區域性物件:當程式執行流到達物件的定義語句時進行構造。 物件定義--->構造---->呼叫建構函式
1 #include2(2)對於堆物件3class
test
413 test(const test& obj) //
拷貝建構函式
1418
19/*
20int getmi()
2124
*/25
};26
27int
main()
2836
37if (i < 4)38
41else
4245
46/*
47goto end; 不能非法改變程式的執行流
4849
test a(100); //a沒有構造,初始化,後面不能使用
50end:
51printf("a.mi=%d\n",a.getmi()); //沒有初始化物件,沒有呼叫建構函式,有的編譯器會輸出隨機值
5253
*/54
return0;
55 }
①當程式執行流到達new語句時建立物件
②使用new建立物件將自動觸發建構函式的呼叫
1 #include23//(3)對於全域性物件堆物件的構造順序 test* a1 = new test(i); 45
class
test
615 test(const test& obj) //
拷貝建構函式
1620
21};
2223
intmain()
24
①物件的構造順序是不確定的
②不同的編譯器使用不同的規則確定構造順序
#ifndef _test_h_#define _test_h_
#includeclass test
}; #endif
#include "test.h"
test t1("t1");//全域性變數#include "test.h"
test t2("t2");//全域性變數
#include "test.h"
test t3("t3");//全域性變數
#include #include "test.h"g++編譯器的輸出結果://注意:全域性變數會先於main函式執行,因此
//4個全域性變數t1-t4會被先構造,再其順序是不確定的,
//要依賴於編譯器。 那麼不同的編譯器使用不同的規則確定全域性變數的構造順序
//當構造完全局物件後,會執行main函式,可以發現
//t5是最後乙個被構造的。
test t4("t4"); //全域性變數 他的構造在main()之前
int main()
//實驗1:g++ main.cpp t1.cpp t2.cpp t3.cpp
//t3->t2->t1->t4->t5:從右向左
//實驗2:g++ t3.cpp t1.cpp main.cpp t2.cpp
//t2->t4->t1->t3->t5:從右向左
(1)區域性物件的構造順序依賴於程式的執行流
(2)堆物件的構造順序依賴於new的使用順序
(3)全域性物件的構造順序是不確定的
17 物件的構造
如果沒有賦初值,全域性儲存區的成員變數初始值系統預設為0,棧空間和堆空間上成員變數初始值系統預設為隨機數。從程式設計的角度,物件只是變數,c 中可以定義與類名相同的特殊成員函式 建構函式。建構函式沒有任何返回型別的宣告。建構函式在物件定義時自動呼叫。每個物件在使用之前都應該初始化,建構函式用於物件初...
11 物件的構造
目錄從程式設計的角度,物件只是變數,因此 問題 程式中如何對乙個物件進行初始化,使得不管在什麼地方建立類物件,其成員變數的初始值都為固定值?解決方案1 存在的問題 解決方案2 建構函式 示例 建構函式 注意 物件定義和物件宣告不同 建構函式的自動呼叫 class test test int v in...
17 物件的構造(中)
1 建構函式 建構函式和普通函式的區別 普通函式的函式名可以隨機定義,而建構函式的函式名和類名一致 普通函式有返回值,而建構函式沒有返回值 普通函式可以定義引數,那麼建構函式可以定義引數嗎?class test test t 定義物件並呼叫建構函式 int main 我們的整個編譯過程分為好幾步 1...