国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++的靜態聯編和動態聯編詳解

2020-05-23 14:24:07
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++的靜態聯編和動態聯編詳解,對于深入理解C++編譯運行原理有很大幫助,需要的朋友可以參考下
 
 

一、概述:

通常來說聯編就是將模塊或者函數合并在一起生成可執行代碼的處理過程,同時對每個模塊或者函數調用分配內存地址,并且對外部訪問也分配正確的內存地址,它是計算機程序彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法:靜態聯編動態聯編

靜態聯編是指在編譯階段就將函數實現和函數調用關聯起來,因此靜態聯編也叫早綁定,在編譯階段就必須了解所有的函數或模塊執行所需要檢測的信息,它對函數的選擇是基于指向對象的指針(或者引用)的類型,C語言中,所有的聯編都是靜態聯編,并且任何一種編譯器都支持靜態聯編。

動態聯編是指在程序執行的時候才將函數實現和函數調用關聯,因此也叫運行時綁定或者晚綁定,動態聯編對函數的選擇不是基于指針或者引用,而是基于對象類型,不同的對象類型將做出不同的編譯結果C++中一般情況下聯編也是靜態聯編,但是一旦涉及到多態和虛擬函數就必須要使用動態聯編了。下面將介紹一下多態。

多態:字面的含義是具有多種形式或形態。C++多態有兩種形式,動態多態和靜態多態動態多態是指一般的多態,是通過類繼承和虛函數機制實現的多態靜態多態是通過模板來實現,因為這種多態實在編譯時而非運行時,所以稱為靜態多態

二、代碼實例:

動態多態實例如下:

#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要調用那個實現了,這就是靜態多態,在編譯時就已經知道了要調用的函數。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平舆县| 丹江口市| 治县。| 科尔| 中江县| 无极县| 济源市| 泰宁县| 沅江市| 阿拉善右旗| 阜城县| 会理县| 河源市| 永昌县| 车致| 枞阳县| 象山县| 扶沟县| 南部县| 宜章县| 林西县| 景宁| 仪陇县| 宜黄县| 景谷| 砀山县| 梁河县| 安庆市| 墨玉县| 扎鲁特旗| 原阳县| 安龙县| 华坪县| 大新县| 咸阳市| 三台县| 西林县| 武清区| 绥宁县| 岳普湖县| 古浪县|