class C{
public:
C(){}
C(int k){key=k;}
~C(){}
private:
int key;
}
現在聲明類C的對象c1,c2,c3。
class C{
public:
C(){key=0;}
C(int k){key=k;}
~C(){}
void func(){cout<<"ok:"<<key<<endl;}
private:
int key;
};
void main(){
C c1;
c1.func();//1.ok
C *pc11=new C;
pc11->func();//2.ok
//C c2();
//c2.func();//3.error
C *pc12=new C();
pc12->func();//4.ok
C c3(2);
c3.func();//5.ok
C *pc2=new C(2);
pc2->func();/6./ok
delete pc11;
delete pc12;
delete pc2;
}
其中:第3種情況錯誤,編譯器以爲C c2()是在聲明一個函數,所以在後面一條語句c2.func()處出錯。
------構造函數和析構函數:
1.構造函數和析構函數均可以定義爲inline函數,但儘量避免定義構造函數和析構函數爲inline函數;
2.析構函數可以定義爲virtual虛函數,但是構造函數不可以定義爲虛函數,因爲虛函數的實現機制是虛調用,在信息不完整的情況下完成對函數的調用,特別是在已知接口而不知道準確對象類型的函數,而構造函數實現對對象的構造,需要已知對象的類型;
3.構造函數和析構函數都不可以定義爲靜態static成員函數;此外,static成員函數不能聲明爲virtual或const類型。