編譯期確切地說應該是得到obj檔案的過程,得到最後可執行檔案的過程叫鏈結
編譯期最前,最後的是執行期。
編譯期錯誤是編譯期間就能被編譯器捕捉到的錯誤,譬如定義乙個過大陣列,不過最常見的還是語法錯誤或者拼寫錯誤。執行期錯誤可以也可以是分配乙個過大的陣列,不過在c++裡面這個可以因為new或者malloc產生,c裡面一般由malloc產生。執行期錯誤還有表示式中的被0除、越界訪問等。
編譯期分配記憶體並不是說在編譯期就把程式所需要的空間在記憶體裡面分配好,而是說在程式生成的**裡面產生一些指令,由這些指令控制程式在執行的時候把記憶體分配好。不過分配的大小在編譯的時候就是知道的,並且這些存貯單元的位置也是知道的。
而執行期分配記憶體則是說在執行期確定分配的大小,存放的位置也是在執行期才知道的。
#include
using namespace std;
class a;
class b:public a
;int main()
出現了很有趣的結果,在main函式中,訪問到了b類中的私有方法。為什麼會出現這樣的結果呢?
一般來說外部物件訪問類的私有成員,除非是友元,否則在編譯的時候就會報錯,但是上面那段**卻可以正常的編譯通過。
c++因為支援物件導向程式設計,制訂了一系列實現策略的語言機制。其中,各種各樣的「限制」主要是出現在編譯時:因此如果直接b
d; d.f(); 就會導致編譯錯誤:編譯器發現
b::f()是b類的私有成員函式,因此拒絕這樣的訪問。
這裡我們可以區分類和物件:類是編譯期的概念,也是「訪問許可權」、「成員資料」、「成員函式」這幾個概念的「作用域」
。而物件的作用域是執行期。它包括類的例項、引用和指標。
a *pa
= new
b();
這裡
pa
是乙個
a* , 所以就作為乙個a類的指標參與了編譯;因此從pa呼叫f()在編譯器眼中,就是呼叫了a類的公開成員函式f()因此通過編譯;然後在執行時,由於多型作用 pa呼叫的f()是派生類的f()成員函式。雖然這時f()是private成員函式,但是由於
private/public
這些訪問控制是編譯時的限制,在執行時無效,
所以b::f() 被成功呼叫。如果能夠理解這兩個在不同時間作用的概念,這個問題就很好理解.
C 編譯期多型與執行期多型
閱讀目錄 關於顯式介面與隱式介面 正文 回到頂部 今日的c 不再是個單純的 帶類的c 語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c 發展中最為出彩的那部分。在物件導向c 程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式...
C 編譯期多型與執行期多型
今日的c 不再是個單純的 帶類的c 語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c 發展中最為出彩的那部分。在物件導向c 程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式設計中,多型基於template 模板 的具現化與...
C 編譯期多型與執行期多型
閱讀目錄 關於顯式介面與隱式介面 正文 回到頂部 今日的c 不再是個單純的 帶類的c 語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c 發展中最為出彩的那部分。在物件導向c 程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式...