在c++的類成員的初始化順序問題上需要注意的是:其成員的初始化順序不是由構造函數所生命的初始化順序來決定的,它的初始化順序是由類中成員數據的生命順序來進行構造的。現舉一例子就會恍然大悟了:
#include <iostream>
class basea
{
public:
basea() {std::cout << "constructor of basea/n";}
~basea() {std::cout << "destructor of basea/n";}
};
class baseb
{
public:
baseb() {std::cout << "constructor of baseb/n";}
~baseb() {std::cout << "destructor of baseb/n";}
};
class test
{
public:
test() : t2(), t1() {} //你認爲初始化順序是t2 t1嗎?
~test() {}
private: //注意下面的數據成員的生命順序,是t1 t2哦
basea t1;
baseb t2;
};
測試結果:
constructor of basea
constructor of baseb
destructor of baseb
destructor of basea
再一個就是基類與派生類中的默認參數問題,如果在派生類中實現基類中的純虛函數,而基類中已經爲此純虛函數定義了一個默認參數,那麼僅僅以基類中所定義的默認參數爲標準。也就是說,無論派生類中是否爲此函數定義了默認參數,其默認參數均取基類的默認參數。用一個測試程序來測試一下你就會很清楚了:
#include <iostream>
class base
{
public:
virtual void test (int i=0) const = 0;
};
class derived :public base
{
public:
void test(int i = 1) const {std::cout << i << std::endl;}
};
void Test()
{
base *p = new derived;
p->test(); //估計你很肯定的說這裏將輸出i的值爲1,真的是這樣嗎?
delete p;
};
void main()
{
test t;
}
測試結果:
1
再來就是c++的動態特性與靜態特性了。所謂動態特性就是類中的成員函數只能在運行的時候根據派生類以及基類的關係進行動態調用;而靜態特性就是在編譯階段就已經確de定了的調用關係,要麼調用基類成員函數,要麼調用派生類的成員函數,它的特定就是隻根據聲明的類定來決定是調用基類還是派生類。說了這麼多,還是來看看一個測試用例理解上面所說的內容吧:
#include <iostream>
class base
{
public:
virtual void test (void) const {std::cout << "output from base test/n";}
};
class derived :public base
{
public:
void test(void) const {std::cout << "output from derived test/n";}
};
void Test()
{
derived d;
base *pb = &d;
pb->test;
derived *pd = &d;
pd->test;
};
void main()
{
Test();
}
測試結果:
output from derived test
output from derived test
如果把基類的virtual關鍵字去掉
測試結果:
output from base test
output from derived test
哈哈,現在相信明白上面我所說的有長有乏味的話吧~