C++基礎1:從C過渡到C++

C plus plus -- C語言的超集
C++可以完全引用C

案例:輸出Hello World

  • 源代碼:HelloWorld.cpp
// 第一個C++程序
#include <iostream>
using namespace std;
int main(){
    cout<< "Hello world" <<endl; 
}
  • 編譯:g++ HelloWorld.cpp -o HelloWorld
  • 執(zhí)行:./HelloWorld
  • 結果:Hello world

麻雀雖小,五臟俱全掂之。

HelloWorld.cpp,看C++與C的基本區(qū)別:

  1. 單行注釋// (C99開始支持單行注釋)
  2. 文件后綴名.cpp
  3. 頭文件#include <iostream>
  4. 命名空間 using namespace std;
  5. 標準輸出流cout宝当、輸出運算符<<谒主、換行控制器endl
  6. 編譯工具g++

1. 源文件后綴

  • C/C++頭文件后綴名區(qū)別
C C++
*.h *.h *.hpp
  • C/C++源文件后綴名區(qū)別
C C++
*.c *.cpp *.cc *.cxx
  • 不同編譯器C++源文件后綴名區(qū)別
平臺 可用后綴名
Unix *.C, *.cc, *.cxx, *.c
GNU C++ *.C, *.cc, *.cxx, *.cpp, *.c++
Borland C++ *.cpp
Microsoft Visual C++ *.cpp, *.cxx, *.cc

2.引用頭文件

C++頭文件使用C標準庫,在C標準庫文件名前加上字母c擎浴,并且省略后綴名.h余佃,例如:

C C++
#include <stdio.h> #include <iosteam> /#include <cstdio>
#include <stdlib.h> #include <cstdlib>
#include <string.h> #include <cstring>
#include <math.h> #include <cmath>

有些C++編譯器同時支持以上兩種頭文件,但有些不色建。請使用C++標準方式


3. 函數重載

實驗: 以下C與C++的編譯執(zhí)行結果

  • printf.c
#include <stdio.h>
void printf(){
    printf("Hello world");
}
int main(){
    printf();
}
  • printf.cpp
#include <cstdio>
void printf(){
    printf("Hello world");
}
int main(){
    printf();
}

函數重載:函數名相同只有參數(個數或者類型)不相同誉碴。

C C++
不支持重載 支持重載

4. 命名空間

實驗: 以下C的編譯結果

  • scope.c
#include <stdio.h>
void test(){
    printf("this is test\n");
}
void test(){
    printf("this is another test\n");
}
int main(){
    test();
}

命名空間

C C++
不支持命名空間 支持命名空間
  • 命名空間的作用:避免全局變量宦棺、函數、類的命名沖突(因為名字相同而編譯失斍痢)代咸。

  • 定義命名空間

namespace 空間名 {
    // 定義類/函數
}
  • 引用命名空間
    • using指令(using directive)
      using namespace 空間名;
      
      例如使用標準命名空間std
      using namespace std;
      
    • using聲明(using declaration)
      using 空間名::標識符;
      
      例如使用標準命名空間stdcout
      using std::cout;
      

C++命名空間處理方式

#include <cstdio>
namespace scope1 {
    void test(){
        printf("this is test\n");
    }
}
namespace scope2 {
    void test(){
        printf("this is another test\n");
    }
}
int main(){
    scope1::test();
    scope2::test();
}

全局命名空間

  • 默認的命名空間,所有名字都在全局命名空間中成黄。
  • 使用方式:直接忽略或者只寫::
    例如:定義全局函數void test();呐芥,默認就是在全局命名空間中,調用方式test()或者::test()奋岁。

在C++中思瘟,不帶.h后綴的頭文件所包含和定義的標識符在std空間中;
.h后綴的頭文件所包含和定義的標識符在全局命名空間中,不需要聲明使用std空間


5. 類型

  • 新增基本類型bool--true/false

在C99中stdbool.h中增加三個宏定義bool闻伶、truefalse滨攻。在C++中是內置類型和常量。
如何驗證C的bool是宏定義蓝翰,C++的bool不是宏定義光绕?

  • password.c
#include <stdio.h>
int main(){
      printf("input user name:");
      char name[BUFSIZ];
      scanf("%s",name);
      printf("input 3 number password:");
      int password1;
      scanf("%d",&password1);
      printf("input 3 number password again:");
      int password2;
      scanf("%d",&password2);
      printf("password check:%d\n", password1 == password2);
}
  • password.cpp
#include <iostream>
#include <cstdio>
using std::cout;
using std::cin;
using std::endl;
int main(){
      cout << "input user name:";
      char name[BUFSIZ];
      cin >> name;
      cout << "input 3 number password:";
      int password1;
      cin >> password1;
      cout << "input 3 number password again:";
      int password2;
      cin >> password2;
      cout << "password check:" << (password1 == password2) << endl;
}
  • 新增自定義類型class
    詳細信息參見:類與對象章節(jié)

6. 思想

C C++
面向過程 面向對象/基于對象

何為面向過程?何為面向對象畜份?

  • 面向過程:強調如何處理(如何解決)
  • 面向對象:強調執(zhí)行處理的對象(找誰解決)

面向過程與面向對象:廚師與老板

思維區(qū)別

  • 將問題按照過程方式來解決诞帐?
  • 將問題抽象為一個對象來解決?

7. 動態(tài)內存

  • 基本類型的動態(tài)內存
  • dynamic_mem.c
#include <stdio.h>
#include <stdlib.h>
int main(){
      int* num = malloc(sizeof(int));
      *num = 100;
      printf("%d\n",*num);
      free(num); 
}
  • dynamic_mem.cpp
#include <iostream>
int main(){
      int* num = new int;
      *num = 100;
      std::cout << *num << std::endl;
      delete num; 
}

動態(tài)內存區(qū)別

C C++
malloc()/free() new/delete

C++仍然可以使用malloc()/free()爆雹,但是不建議這么做停蕉。

問題:

  • malloc()申請內存,是否可以使用delete銷毀內存顶别?
  • new申請內存谷徙,是否可以使用free()銷毀內存拒啰?

8. 初始化

C++特殊初始化方法

int n=10;
int m(10);

擴展閱讀

練習

  • 完成上面擴展閱讀中的習題和練習谋旦。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末剩失,一起剝皮案震驚了整個濱河市屈尼,隨后出現的幾起案子,更是在濱河造成了極大的恐慌拴孤,老刑警劉巖脾歧,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異演熟,居然都是意外死亡鞭执,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門芒粹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兄纺,“玉大人,你說我怎么就攤上這事化漆」来啵” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵座云,是天一觀的道長疙赠。 經常有香客問我,道長朦拖,這世上最難降的妖魔是什么圃阳? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮贞谓,結果婚禮上限佩,老公的妹妹穿的比我還像新娘。我一直安慰自己裸弦,他們只是感情好祟同,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著理疙,像睡著了一般晕城。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窖贤,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天砖顷,我揣著相機與錄音,去河邊找鬼赃梧。 笑死滤蝠,一個胖子當著我的面吹牛,可吹牛的內容都是我干的授嘀。 我是一名探鬼主播物咳,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蹄皱!你這毒婦竟也來了览闰?” 一聲冷哼從身側響起芯肤,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎压鉴,沒想到半個月后崖咨,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡油吭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年击蹲,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婉宰。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡际邻,死狀恐怖,靈堂內的尸體忽然破棺而出芍阎,到底是詐尸還是另有隱情世曾,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布谴咸,位于F島的核電站轮听,受9級特大地震影響,放射性物質發(fā)生泄漏岭佳。R本人自食惡果不足惜血巍,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望珊随。 院中可真熱鬧述寡,春花似錦、人聲如沸叶洞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽衩辟。三九已至螟炫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艺晴,已是汗流浹背昼钻。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留封寞,地道東北人然评。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像狈究,于是被迫代替她去往敵國和親碗淌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容