從C到C++


C++讀作“C加加”,是“C Plus Plus”的簡稱,C++是在C語言的基礎上增加新特性,從語法上看,C語言是C++ 的一部分,C語言代碼幾乎不用修改就能夠以 C++ 的方式編譯。

對於C和C++的關係,有很多種說法,從表面上看,很容易認爲C++是C的升級版,C++比C高大上,C過時了,有這種想法說明他不瞭解C/C++語言,我們先來看看世界編程語言排行榜,下表是2019的數據(過去十年的數據也大致如此)。
在這裏插入圖片描述
從上表中看出,這個世界上的C程序員比C++程序員多很多。

這麼多年了,我也搞不清楚自己是C程序員,還是C++程序員,好像沒什麼差別。

C++有很多新的特徵,這些新特徵並不一定實用,甚至很煩人。但是,C++的開發效率確實比C要高,所以我仍然採用斷章取義的方式來介紹C++的知識。不管是C還是C++,實用就好。

一、C++程序的命名規則

C++頭文件一般採用.h後綴,也用有.hpp的。

C++程序文件一般採用.cpp後綴,也有用.cc的,建議採用.cpp,C++對程序文件的命名沒有強制要求,採用.cpp爲後綴是大部分程序員的習慣。

二、C++程序的編譯

在某些操作系統中,C和C++是同一個編譯器,在CentOS中,C的編譯器是gcc,C++的編譯器是g++。

1、安裝g++編譯器

用root用戶登錄服務器,執行以下命令安裝或升級gcc-c++編譯器。

yum  -y  install  gcc-c++ 

如果您的CentOS系統沒有安裝gcc-c++,以上命令就會安裝最新版本的gcc-c++,如果已經安裝了gcc-c++,就會更新到最新版本的gcc-c++,所以,以上命令不管執行多少次都沒有問題。

安裝gcc-c++的前提條件是服務器必須可以訪問互聯網。

2、編譯C++程序

編譯C程序的命令是gcc,編譯C++程序的命令是g++,g++命令和gcc命令的用法相同,把gcc改爲g++就可以了,我們在學習C語言時編寫的那些示例程序,基本上都可以用g++來編譯。

在這裏插入圖片描述

三、C++是面嚮對象語言

C語言是面向過程的編程語言,C++是面向對象的編程語言,很多人認爲面向對象會比面向過程的方法更先進。仁者和智者的說法各有不同,大家慢慢體會,不能人云亦云。

C++的對象,確實可以大幅的提升了C程序員的開發效率,降低程序員犯錯的機會。

四、C++輸入和輸出

在C語言中,我們使用scanf和printf來對數據進行輸入輸出操作。在C++語言中,增加了cin和cout輸入輸出,但是我從來不用它,因爲它不實用,對格式化的支持實在是太麻煩。

printf實在太完美,太強大。

五、C++異常

C++增加了異常機制,但是,它從誕生開始就一直有爭議。

我沒有發現C++的異常有什麼實用價值,也從來沒有用過它。

六、C++命名空間和模板

瞭解一下命名空間和模板的概念和用法是可以的,會使用就行,但我不建議自定義命名空間和模板,沒必要把程序搞得那麼麻煩。

七、C++布爾類型(bool)

C語言並沒有徹底從語法上支持“真”和“假”,只是用 0 和非 0來代表。這點在 C++中得到了改善,C++
新增了 bool 類型(布爾類型),它佔用 1 個字節長度。bool 類型只有兩個取值,true和 false:true 表示“真”,false 表示“假”。

bool 是類型名字,也是 C++ 中的關鍵字,它的用法和 int、char、long是一樣的,可以用=賦值,可以用於函數的參數和返回值。

  bool flag=true;  // 定義bool型變量flag,賦值爲true

  if (flag) printf("flag is true");
  else printf("flag is fals");

  flag=false;    // 把flag賦值爲false

  if (flag) printf("flag is true");       
  else printf("flag is fals");  

八、C++定義變量的位置

ANSI C規定,所有局部變量都必須定義在函數開頭,在定義變量之前不能有其他的執行語句。C99標準取消這這條限制,但是某些編譯器對C99的支持很不積極,仍然要求變量定義在函數開頭,或者只支持一部分。

取消限制帶來的另外一個好處是,可以在 for 循環的控制語句中定義變量。

  int total=0;

  for(int ii=1; ii<=100 ;ii++)
  {
    total = total + ii;
  }

這個很棒,程序更簡潔,更自由。

九、C++函數的缺省參數

在C語言中,函數在聲明的時候指定了參數列表,調用的時候函數參數的個數、順序和數據類型必須與函數聲明參數列表相同,但是在C++中,聲明函數的時候,可以爲函數指定缺省參數,調用時缺省參數可以不填寫。例如:

int writetofile(FILE *fp,char *strbuf,bool enbuffer=true); // 指定參數enbuffer的缺省值爲true

enbuffer參數表示是否啓用緩衝區,writetofile函數被調用的時候,如果只寫fp和strbuf參數,不寫enbuffer參數,enbuffer參數將缺省爲true,例如:

writetofile(fp,strbuf);  // 調用函數的時候,如果第三個參數enbuffer不填,就用缺省值true

這個不錯,程序更簡潔。

十、C++動態內存管理

在C語言中,動態管理內存用 malloc() 函數,釋放內存用 free() 函數。

在C++中,這兩個函數仍然可以使用,但是C++又新增了兩個關鍵字,new 和 delete,new用來動態分配內存,delete 用來釋放內存。

和C語言的動態內存管理一樣,C++動態內存管理的應用場景不多。

十一、C++的學習的策略

在我看來,C++至少有70%的內容沒有實用價值,在這個階段,我們先只學習C++中重要的、有實用價值的內容,十天左右的時間可以完成,如下:

1)C++函數重載;

2)類的基本知識。

3)引用。

4)string類。

5)vector容器。

6)類的繼承。

然後學習Linux編程基礎,再進入職業技能教程,在學習完職業技術程後,您的學習能力和判斷能力遠遠超過今日,再回頭來看看C++的其它知識,網上的免費視頻到處都是,三天就可以完成。

學習的技巧很重要,在基礎知識上花太多的時間容易打擊學習的積極性,那些沒有實用價值的知識還會浪費您寶貴的時間。

十二、課後作業

編寫您最後一個C程序,生成一個makefile文件,把您在學習C語言基礎時寫的源代碼用C++來編譯,個別用到_public.h和_public.c的程序例外用手工處理。順便看看C++編譯器和C有什麼不同。

十三、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道

如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章