C++學習之從C到C++
標頭檔案的包含
C++的標頭檔案
包含標頭檔案可以不加.h結尾,如iostream,一些常用的標頭檔案在引用時可以不加.h字尾,並在開頭增加c,如:
#include <cstdio> #include <cstring> #include <cstdlib>
強制型別轉換
在C中的強制型別轉換為:(int )3.5;
而在C++中的強制型別轉換為int(3.5),更加清晰直觀。
預設引數
在 C++ 中,宣告一個函式時,可以指定預設的輸入引數值。當呼叫有預設引數值的函式時,可以不寫出引數,這時就相當於以預設值作為引數呼叫該函式。
例如:
void Function1(int x=20); //函式的宣告中,指明引數 x 的預設值是 20 Function1(); //正確的呼叫語句,等效於 Function1(20);
不僅可以用常數,還可以用任何有定義的表示式作為引數的預設值。例如:
int Max(int m, int n); int a, b; void Function2(int x, int y=Max(a,b), int z=a*b) { //... } Function2(4);//正確,等效於 Function2(4, Max(a,b), a*b); Function2(4, 9);//正確,等效於 Function2(4,9 , a*b); Function2(4, 2, 3);//正確 Function2(4, ,3);//錯誤!這樣的寫法不允許,省略的引數一定是最右邊連續的幾個
C++中增加函式引數的預設值,可以像上面的 Function1 那樣寫在宣告函式的地方,也可以像 Function2 那樣寫在定義函式的地方,但是不能在兩個地方都寫。
函式預設引數所帶來的好處是使程式的可擴充性更好,即當程式需要增加新功能時,改動可以儘可能少。
試想下面這種情況。一個即將編寫完成的繪圖程式,其中有一個畫圓的函式 Circle,畫出來的圓都是黑色的,這時希望增加畫彩色圓的功能,於是就需要在 Circle 函式中增加一個 int 型的 color 引數,用來表示顏色。
但是原來的程式中可能大多數呼叫 Circle 函式的地方依然只是畫個黑色的圓就可以了,只有少數幾個地方需要改成畫彩色的圓。此時,如果要找出所有呼叫 Circle 函式的語句並補上顏色引數,會十分煩瑣。
而有了函式引數預設值的機制,則只需為 Circle 函式的新引數指定預設值 0(假定 0 代表黑色),然後找出少數幾個呼叫 Circle 函式畫彩色圓的地方,補上顏色引數即可。
實踐中這種情況 是經常發生的。
引用
在 C++ 中可以定義“引用”。定義方式如下: 型別名 &引用名 = 同類型的某變數名;
此種寫法就定義了一個某種型別的引用,並將其初始化為引用某個同類型的變數。“引用名”的命名規則和普通變數相同。例如:
int n; int & r = n;
r 就是一個引用,也可以說 r 的型別是 int &。第二條語句使得 r 引用了變數 n,也可以說 r 成為了 n 的引用。
某個變數的引用和這個變數是一回事,相當於該變數的一個別名。
也可以用一個引用去初始化另一個引用,這樣兩個引用就引用同一個變數。不能用常量初始化引用,也不能用表示式初始化引用(除非該表示式的返回值是某個變數的引用)。
總之,引用只能引用變數。
型別為 T& 的引用和型別為 T 的變數是完全相容的,可以互相賦值。
引用的示例程式如下:
#include <iostream> using namespace std; int main() { int n = 4; int & r = n; //r引用了n,從此r和n是一回事 r = 4; //修改r就是修改n cout << r << endl;//輸出4 cout << n << endl;//輸出4 n = 5;//修改n就是修改r cout << r << endl;//輸出 5 int & r2 = r;//r2和r引用同一個變數,就是n cout << r2 << endl; //輸出 5 return 0; }
- 注意:定義引用時一定要將其初始化,否則編譯無法通過。通常會用某個變數去初始化引用,初始化後,它就一直引用該變數,不會再引用別的變數。
引用作為函式的返回值
函式的返回值可以是引用。例如下面的程式:
#include <iostream> using namespace std; int n = 4; int & SetValue() { return n;//返回對n的引用 } int main() { SetValue() = 40;//返回值是引用的函式呼叫表示式,可以作為左值使用 cout << n << endl;//輸出40 int & r = SetValue(); cout << r << endl;//輸出40 return 0; }
SetValue 函式的返回值是一個引用,是 int & 型別的。因此第 6 行使得其返回值成為變數 n 的引用。
第 10 行,SetValue 函式返回對 n 的引用,因此對 SetValue 函式的返回值進行賦值,就是對 n 進行賦值,結果就是使得 n 的值變為 40。
第 12 行,表示式 SetValue 函式的返回值是 n 的引用,因此可以用來初始化 r,其結果就 是 r 也成為 n 的引用。
總結
以上只是C和C++不同的幾個點,其實還有很多不同的地方,如行內函數、函式過載、動態分配記憶體和字串型別等等。C是面向過程的,而C++是面向物件的,面向物件的程式設計有以下4個特點:
- 抽象
- 封裝
- 繼承
- 多型
總之,面向物件的程式設計方法繼承了結構化程式設計方法的優點,同時又比較有效地克服了結構化程式設計的弱點。
Jlink使用技巧系列文章:
- Jlink使用技巧之合併燒寫檔案
- Jlink使用技巧之燒寫SPI Flash儲存
- Jlink使用技巧之虛擬串列埠功能
- Jlink使用技巧之讀取STM32內部的程式
- Jlink使用技巧之J-Scope虛擬示波器功能
- Jlink使用技巧之單獨下載HEX檔案到微控制器
歡迎大家關注我的個人部落格
或微信掃碼關注我的公眾號
