C++的靜態聯編和靜態聯編詳解。本站提示廣大學習愛好者:(C++的靜態聯編和靜態聯編詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++的靜態聯編和靜態聯編詳解正文
1、概述:
平日來講聯編就是將模塊或許函數歸並在一路生成可履行代碼的處置進程,同時對每一個模塊或許函數挪用分派內存地址,而且對內部拜訪也分派准確的內存地址,它是盤算機法式彼此聯系關系的進程。依照聯編所停止的階段分歧,可分為兩種分歧的聯編辦法:靜態聯編和靜態聯編。
靜態聯編是指在編譯階段就將函數完成和函數挪用聯系關系起來,是以靜態聯編也叫早綁定,在編譯階段就必需懂得一切的函數或模塊履行所須要檢測的信息,它對函數的選擇是基於指向對象的指針(或許援用)的類型,C說話中,一切的聯編都是靜態聯編,而且任何一種編譯器都支撐靜態聯編。
靜態聯編是指在法式履行的時刻才將函數完成和函數挪用聯系關系,是以也叫運轉時綁定或許晚綁定,靜態聯編對函數的選擇不是基於指針或許援用,而是基於對象類型,分歧的對象類型將做出分歧的編譯成果。C++中普通情形下聯編也是靜態聯編,然則一旦觸及到多態和虛擬函數就必需要應用靜態聯編了。上面將引見一下多態。
多態:字面的寄義是具有多種情勢或形狀。C++多態有兩種情勢,靜態多態和靜態多態;靜態多態是指普通的多態,是經由過程類繼續和虛函數機制完成的多態;靜態多態是經由過程模板來完成,由於這類多態其實編譯時而非運轉時,所以稱為靜態多態。
2、代碼實例:
靜態多態實例以下:
#include <stdio.h> #include <iostream> /** *Shape */ class CShape { public: CShape(){} virtual ~CShape(){} virtual void Draw() = 0; }; /** *Point */ class CPoint : public CShape { public: CPoint(){} ~CPoint(){} void Draw() { printf("Hello! I am Point!/n"); } }; /** *Line */ class CLine : public CShape { public: CLine(){} ~CLine(){} void Draw() { printf("Hello! I am Line!/n"); } }; void main() { CShape* shape = new CPoint(); //draw point shape->Draw();//在這裡shape將會挪用CPoint的Draw()函數 delete shape; shape = new CLine(); //draw Line shape->Draw();//而在這裡shape將會挪用CLIne 的Draw()函數 delete shape; return ; }
年夜家可以斟酌一下它的輸入成果,假如其實不曉得,那就費事你運轉一下它吧!
由下面的例子,年夜家應當能懂得甚麼是多態了:也就是一個Draw() 可以有兩種完成,而且是在運轉時決議的,在編譯階段不曉得,也弗成能曉得!只要在運轉的時刻能力曉得我們生成的shape是那種圖形,固然要完成這類後果就須要靜態聯編了,在基類我們會把想要多態的函數聲明為虛函數,而虛函數的完成道理就應用了靜態聯編。假如你想懂得的更透辟,那就上彀查查材料吧!在這裡我就不再煩瑣虛函數的完成道理了。
這裡也供給一個靜態多態的例子:
在下面例子的基本之上添加模板函數:
template <class T> void DrawShape(T* t) { t->Draw(); }
修正main函數為以下:
void main() { CShape* shape = new CPoint(); //draw point shape->Draw(); DrawShape<CPoint>((CPoint*)shape); delete shape; shape = new CLine(); //draw Line shape->Draw(); DrawShape<CLine>((CLine*)shape); delete shape; return ; }
在法式編譯main函數的時刻,編譯器就曾經指定了DrawShape函數外面的Draw要挪用誰人完成了,這就是靜態多態,在編譯時就曾經曉得了要挪用的函數。