1. 程式人生 > >C++在一個類中定義另一個有引數建構函式的類的物件

C++在一個類中定義另一個有引數建構函式的類的物件

class A{public:      A( int i ){}};class B {public:      B():a(1){}   //或:B( int i ):a( i ){ }。對a提供引數一定要按                  //這種形式,在冒號後,不能在花括號裡面!private:      A a;};void main(){      B b;} 在B中定義 A a; 是可以通過的,但在其他地方(比如函式中)這樣是不對的。 在B中定義 A a; 只是告訴編譯器:“B有一個A類的物件”,並不在定義的時候建立a這個物件成員,也就不考慮它的建構函式。a這個物件成員的建立是在執行B的建構函式時進行的,B的建構函式後面必須以初始化表的形式為a物件成員提供引數,比如 B( ) : a( 1 ) { } 如果在建構函式中不為a提供引數,會發生錯誤。 在其他地方(比如函式中)定義A的物件時,必須定義成 A a(引數);的形式。因為定義時就要建立A的物件,所以要考慮它的建構函式。類中定義的所有物件(包括基本型別的資料物件、無參類物件等等)的構造都是在此類的初始化列表中進行的,只不過無參和基本型別的物件被省略了。在建構函式體內的所謂初始化,只是給已經生成的物件重新賦值罷了,並沒有進行物件的構造。就是說物件構造必須在初始化列表裡。這意味著其他類物件的構造先於本類的構造。如果在類中宣告的是其他類的指標,則指標初始化可以後於本類的構造。比如:class B {public:    B(){a=new A(1);}   private:      A* a;};產生區別的原因是其他類物件屬於類物件成員,指標不屬於類物件成員。類在構造物件時,預設會先構造類物件成員(相當於在初始化類表中),在預設建構函式中會釋放類物件成員的資源。而指標不屬於類物件成員,不會被預設分配記憶體,也不會預設釋放,需要手動分配記憶體,在解構函式中手動釋放記憶體(自定義解構函式後,預設解構函式還是存在,而且會執行,先執行自定義的析構)。