第一篇:cpp12例04-1派生類構造函數對基類構造函數的隱含調用
[例] 派生類構造函數對基類構造函數的隱含調用
#include
class A
{int a;
public:
A(){a=0;}// 基類缺省構造函數A(int i){a=i;}// 基類有參構造函數void print(){cout< }; class B:public A {int b1,b2; public: B()// 隱式調用基類缺省構造函數 {b1=0;b2=0;} B(int i)// 隱式調用基類缺省構造函數 {b1=i;b2=0;} B(int i,int j,int k): A(i)// 顯示調用基類有參構造函數 {b1=j;b2=k;} void print() {A::print();cout< }; void main() {B d1;//輸出: 0,0,0 B d2(5);//0,5,0 B d3(4,5,6);//4,5,6 d1.print();d2.print();d3.print();} class parent { } class son:public parent { } 上面的代碼完成了下面的工作: 派生類對象存儲了基類的數據成員(派生類繼承了基類的實現) 派生類對象可以使用基類的方法(派生類繼承了基類的接口) 派生類需要進行下面的工作: 需要自己的構造函數 可以根據需要添加額外的數據成員和成員函數 派生類構造函數:訪問權限 派生類不能直接訪問基類的私有成員,而必須通過基類方法進行訪問。 具體地說就是,派生類構造函數必須使用基類構造函數。 創建派生類對象的時,程序首先是創建基類的對象,在C++使用成員初始化列表句法來完成繼承工作.例如: son::son(int r,const char *p,const char *pp,bool vb):parent(r,p,vb) { ...} 當然,也可以省略成員初始化列表 son::son(int r,const char *p,const char *pp,bool vb) { ...}] 如此一來,對象首先被創建,如果不調用基類構造函數,程序將使用默認的基類構造函數,因此上面的構造 方式和下面的構造方式相同: son::son(int r,const char *p,const char *pp,bool vb):parent() { ...} 派生類構造函數有一些重要的性質需要注意的: 基類對象首先被創建 派生類構造函數應通過成員初始化列表將基類信息傳遞給基類構造函數 派生類構造函數應該初始化派生類新增的數據成員 在進行對象釋放的時候,順序與創建對象時是相反的,即派生類對象首先被釋放,之后才是基類對象. 構造函數 1.設 f(x),g(x)分別為定義在R上的奇函數和偶函數,當x?0時,f?(x)g(x)?f(x)g?(x)?0,且g(?3)?0,則不等式f(x)g(x)?0的解集為______.2.設f(x)是定義在R上的奇函數,且f(2)?0,當x?0時,有x? f?(x)?f(x)?0 恒成立,則不等式x2f(x)?0的解集為__________.3.已知函數f(x)是定義在R上的奇函數,且當x?(??,0)時,有x?<0成立,若a?30.3? b f?(x)+f(x)1 3f(3 0.3),b??log?3?? f(log ? 3),c?(log 9)?f(log 9),則a、、c的大小關系為__________.f(x),則當a?0 4.已知可導函數f(x)滿足f?(x)?系為__________.時,f(a)與ea? f(0)的大小關 5.若函數f(x)對任意的x?R都有f?(x)? A.3f(ln2)?2f(ln3) f(x) 成立,則__________.B.3f(ln2)?2f(ln3) C.3f(ln2)?2f(ln3)D.3f(ln2)與2f(ln3)的大小關系不確定 6.設f(x)是R上的奇函數,且f(?1)?0,當x?0時,(x2 ?1)?f?(x)?2x?f(x)?0,則不等式f(x)?0的解集為__________.7.已知函數f(x)是定義在(0,??)的非負可導函數,且滿足x?對任意正數a、b,若a f?(x)+f(x)?0,B.af(b)?bf(a)C.af(a)?f(b) D.bf(b)?f(a),8.已知f(x)與g(x)都是定義在R上的函數,g(x)?0,f?(x)g(x)? f(x)?a?g(x),x f(x)g?(x)?0 f(1)g(1) ? f(?1)g(?1) ? .在有窮數列? ?f(n)? ?(n?1,2,?,10)中,前kg(n)?? 項和 為 1516,則k=__________. 函數與方程數學思想方法是新課標要求的一種重要的數學思想方法,構造函數法便是其中的一種。 高等數學中兩個重要極限 1.limsinx?1 x?0x 11x2.lim(1?)?e(變形lim(1?x)x?e)x?0x??x 由以上兩個極限不難得出,當x?0時 1.sinx?x,2.ln(1?x)?x(當n?N時,(1?)n?e?(1?)n?1). 下面用構造函數法給出兩個結論的證明. (1)構造函數f(x)?x?sinx,則f?(x)?1?cosx?0,所以函數f(x)在(0,??)上單調遞增,f(x)?f(0)?0.所以x?sinx?0,即sinx?x. (2)構造函數f(x)?x?ln(1?x),則f?(x)?1??1n1n1x??0.所以函數f(x)在1?x1?x (0,??)上單調遞增,f(x)?f(0)?0,所以x?ln(1?x),即ln(1?x)?x. ?1?要證?1???n?事實上:設1?n?11?1??e,兩邊取對數,即證ln?1???, nn?1??11?t,則n?(t?1), nt?1 1因此得不等式lnt?1?(t?1)t 1構造函數g(t)?lnt??1(t?1),下面證明g(t)在(1,??)上恒大于0. t 11g?(t)??2?0, tt ∴g(t)在(1,??)上單調遞增,g(t)?g(1)?0, 即lnt?1?, 1 t 1?1??1?∴ ln?1???,∴?1???n??n?n?1n?1?e,以上兩個重要結論在高考中解答與導數有關的命題有著廣泛的應用. C++繼承中構造函數、析構函數調用順序及虛函數的動態綁定 昨天面試被問到這些,慚愧的很,居然搞混了,悔恨了一把。決定要徹底搞清楚。也算是有所收獲。 首先說說構造函數,大家都知道構造函數里就可以調用成員變量,而繼承中子類是把基類的成員變成自己的成員,那么也就是說子類在構造函數里就可以調用基類的成員了,這就說明創建子類的時候必須先調用基類的構造函數,只有這樣子類才能在構造函數里使用基類的成員,所以是創建子類時先調用基類的構造函數然后再調用自己的構造函數。通俗點說,你要用某些物品,但這些物品你沒辦法自己生產,自然就要等別人生產出來,你才能拿來用。 接著就是析構函數了,上面說到子類是將基類的成員變成自己的成員,那么基類就會只存在子類中直到子類調用析構函數后。做個假設:假如在基類的析構函數調用比子類的先,這樣會發生什么事呢?類成員終止了,而類本身卻還在,但是在類存在的情況下,類成員就應該還存在的,這不就產生矛盾了嗎?所以子類是調用自身的析構函數再調用基類的析構函數。 現在到了虛函數了,virtual主要作用是在多態方面,而C++的多態最主要的是類的動態綁定,動態綁定則是指將子類的指針或引用轉換成基類對象,基類對象就可以動態判斷調用哪個子類成員函數。這就說明在沒有子類指針或引用轉換為基類對象的話,virtual沒有存在意義(純虛函數除外),也就是有沒有virtual都是調用其自身的成員函數。通過這些分析,對于virtual就有了眉目了。當子類指針或引用轉換為基類時,若基類中有用virtual定義的函數,被子類重寫后,此基類對象就會根據子類調用子類中的重寫后的函數,而不是基類中的函數;反之,若是基類中沒有用virtual定義,則不管基類被賦值的是哪個子類的值,調用的都是基類的成員函數(當然指的是子類重載的基類函數,不然就算要調用子類特有的成員函數也會編譯不過)。第二篇:派生類構造函數解析
第三篇:構造函數
第四篇:構造函數法
第五篇:構造函數-析構函數的調用順序