1. 程式人生 > >C++簡單介紹

C++簡單介紹

必須 cpp rpc 跳過 動態 resolved line 實際應用 cast

一、怎樣用C++的源文件產生一個可運行程序

一個C++程序由一個或者多個編譯單元組成。每一個編譯單元都是一個獨立的源碼文件。一般是一個帶.cpp的文件,編譯器每次編一個文件編譯單元,生成一個以.obj或者.o為後綴的目標文件。程序就是執行在這些目標文件上。這些目標文件都是二進制的文件。一旦全部的編譯單元都生成了目標文件,我們就用連接器將他們連接成一個可執行的.exe文件。

我們能夠在一個.cpp文件裏實現多個類,也能夠將多個類分散的放在多個.cpp文件裏。

當改動了某一個.cpp文件後,我們僅僅須要又一次編譯這個文件。就可生成新的可運行程序。

通過編譯器。能夠將兩個cpp文件分別編譯生成.o

文件。在通過.o文件生成可運行程序。比如:

CC -c main.cpp

CC -c test.cpp

CC main.o test.o -o test

最後運行./test 123

main文件裏調用了test文件裏的函數。在調用前須要聲明test中的函數。假設文件過多的時候會出現反復聲明的問題,比方A中聲明了B中的函數。C中也聲明了B中的函數,這時候用A調用C時會出現這個函數聲明反復的錯誤。連接器會報錯輸出“unresolved symbol”(不可解析的符號),所以在實際應用中。我們是通過將這個函數聲明寫入頭文件裏,如.h\.hh\.phh\.hxx等。在我們須要調用這個函數的時候。包括這個函數的頭文件就能夠了。格式例如以下:

#ifndef TEST_H

#define TEST_H

int test(int);

#endif

不要覺得程序就是一些目標文件組成的。實際情況中。可運行程序通常都會連接很多庫。這些庫已經實現了很多現成的功能。庫主要有兩種類型:

l 靜態庫能夠直接放入可運行程序中。就像目標文件一樣,但會使可運行文件變得非常大。

l 動態庫DLL位於機器上的標準位置,而且在應用程序啟動的時候自己主動載入他們。

C++的可編譯性和對性能的追求是不同於JavaC#等語言的。

C++不會在執行時檢測數組是否越界,沒有垃圾信息收集器回收那些分配出去可是不再使用的動態內存。

高字節在後的系統架構(如PowerPC

SPARC)。23位變量值0x12345678會存儲為4個字節:0x120x340x560x78。對於高字節在前的系統架構(比方Intel x86體系)。這些字節存儲順序會被顛倒過來。這樣就會把內存區域中數據拷貝到磁盤或者在網絡上發送二進制程序中產生差異。

二、C++語法

內斂函數(inline)在類定義中已經實現了方法。

與之相應的是把函數原型放在頭文件裏。而把實現這些函數的代碼放在.cpp文件裏。

從語法上講這兩種方法是等效的。可是當我們調用內聯函數時,絕大多數編譯器僅僅是對此函數做簡單的擴展,而不會生成實際的函數調用。

這樣會是程序執行效率更高。可是相應的會帶來應用程序的增大。所以。僅僅有很easy的函數才實現為內聯函數。

Virtual fun()=0//純虛函數——沒有默認實現代碼而且必須在子類中實現的函數。

C++中,假設是僅僅想某個實例對象的指針要訪問類方法時,必須使用“->”,假設是實例則能夠用“.”。

New動態分配的對象一般分配在“堆”上,而局部變量(在函數中定義的變量)則存儲在“棧”裏。

將指針定義為const類型,能夠限制指針不讓其改動它們,僅僅能用於調用常量成員。

Typedef又一次定義數據類型,設定成其它的名字(別名)

C++中的數據類型強制轉換,此語法功能很強大。

能夠改變指針類型,移除const等等。

C++中引入4種具有更為準確語義的新強制轉換類型。

1Static_cast<T>()可用於把指向A的指針強制轉換為指向B的指針,其約束條件是類B必須是類A的子類。

2Dynamic_cast<T>(),與Static_cast<T>()類似,僅僅是它使用的是執行時類型信息的方法來驗證與這個指針相關的對象是否是類B的一個實例。

假設不是,強制轉換就會返回一個空指針null

3Const_cast<T>()加入或移除對指針或者引用的const限定。

4Reinterpret_cast<T>()把人一類型的指針或者引用轉換成隨意的其它類型。

可能有點模糊。我的理解就是Static_cast<T>()這樣的情況是對那些操作轉換規範不會出問題的轉換用的,Dynamic_cast<T>()則是對那些可能出錯的轉換用的。由於有返回信息能夠查看是否轉換成功,希望有更好的解釋在以下告訴我。其它兩個還算比較清晰。

Static靜態keyword的功能是讓被此keyword聲明的變量或者函數僅僅能在此編譯單元下用,稱這樣的情況較靜態連接(static linkage)。其它情況則成為外部連接(external linkage)。

命名空間的使用除了::前面加上這個命名空間名。還有以下三種機制:

定義命名空間的別名

Namespace a = aaaaaaaaaaaaaaaaaaaaaaaaa;

從命名空間中導入一個簡單的標識符

Using aaaaaaaaaaaaaaaaaaaaaaaaaaa::fun;

fun();

僅僅用一條指令導入整個命名空間

Using namespace aaaaaaaaaaaaaaaaaa;

預處理器就是一個程序,能夠把帶“#”指令符轉換成不在包括哪些指令符的源文件。

1、#include指令會把<>””包括的頭文件擴展成他們的內容。

2、#define替換成宏定義的內容。

3、#undef解除宏定義。

4、#if#elif#else#endif能夠處理或者跳過某部分代碼。

5、#ifdef#ifndef來避免反復包括某個頭文件。

6、#error能夠在編譯時給出用戶自己定義的錯誤信息。

C++簡單介紹