前面我們學習C語言的時候,我們也有講過C++的部分歷史,我們看其名字就知道其和我們的C語言肯定是有密不可分的關系的,我們的C++是在C的基礎上發展的,其彌補了C語?在表達能?、可維護性 和可擴展性??的不?。
下面為C++的近年來的幾次更新:
?其在前面的時候,我們會發現其是五年一個更新,不過我們發現在C++11的版本后,其又變成了3年一個更新。這是因為在后面其對于一些功能的優化和實現變得越來越復雜,后面C++團隊就從變成了,三年一個更新。
一、C++的第一個程序
前面我們剛剛開始學習C語言的時候,我們的第一個程序是在屏幕上打印Hello? world,下面我們也一樣使用C++在屏幕上實現這個功能。
下面我們將C語言和C++的都實現一遍,然后我們來看看這兩個語言的區別。
代碼如下:
我們發現其要在屏幕上打印Hello world代碼還是有很大差異的,首先就是其多了using namepace std;語句,然后其是使用的cout來進行打印的。對于這幾個不同的我們下面會進行詳細的講解。
這里我們要知道的是:
C++兼容C語?絕?多數的語法,所以C語?實現的hello world依舊可以運?,C++中需要把定義?件 代碼后綴改為.cpp,vs編譯器看到是.cpp就會調?C++編譯器編譯,linux下要?g++編譯,不再是gcc。
二、命名空間
?1、namespace的意義
在C\C++中,變量、函數和后面我們要學到的類都是大量存在的,這些變量、函數、和類的名稱將都存在于全局作用域中、那么就可能會導致我們的名稱會有重復的,我們使用命名空間的目的是對標識符的名稱進行進行本地化,以避免命名沖突或命名污染,namespace的出現就是為了解決這個問題的。
如下:
我們運行這個代碼,那么程序就會報錯,這是因為頭文件stdlid.h中有一個函數名為rand的函數,那么我們定義的全局變量就和這個函數的名字沖突了,導致的無法編譯。
那么當我們將這個頭文件去掉后,那么我們就可以順利的在屏幕上將10打印出來了。
2、namespace的定義
- 定義命名空間需要用到namespace關鍵字,然后后面跟命名空間的名字,然后接上一對{}即可,{}中即為命名空間中的成員。命名空間中可以定義變量\函數\類型等。
- namespace本質上是一個域,這個域和全局域是獨立的,不同的域可以定義同名變量。
- C++中域有函數局部域,全局域,命名空間域,類型;域影響的是編譯的時候語法查找一個變量\函數\類型出處(聲明或定義)的邏輯,所以有了域隔離,那么名字沖突就解決了。局部域和全局域除了會影響編譯查處邏輯,還會影響變量的生命周期,命名空間和類域不影響變量生命周期。
- namespace只能定義在全局,,當然其還可以嵌套定義。
- 項目工程中多文件中定義的同名namespace會認為其是一個namespace,不會沖突
- C++標準庫都放在一個叫std的命名空間中
3、命名空間的使用
上面我們學習了命名空間的定義,那么我們定義好一個命名空間后,我們要如何進行使用呢?
1、指定命名空間訪問,項目中我們推薦使用這種方式
如下:
2、using將命名空間中某個成員展開,項目中經常訪問的不存在沖突的成員推薦使用這種方式。
如下:
?
相當于函數的聲明一樣,告訴編譯器我們代碼中有這個東西。
3、展開命名空間中的所有成員,項目中不推薦這種方式,容易產生沖突,日常的練習和程序還可以使用。
?
?三、C++輸入和輸出
?首先我們的C++是兼容C的大部分語法的,所以我們在C++中也可以通過包含其頭文件調用C語言中的庫函數。
然后我們的C++其也有屬于其自己的輸入輸出方式:
1、使用cout標準輸出對象,和cin標準輸入對象,要注意的是我們要使用這兩個標準輸出輸入流,必須要包含頭文件,還有按命名空間使用方法包含std。
2、cout 和 cin 是全局的流對象,endl 是特殊的C++符號,表示換行輸出,他們都包含在包含
? ? iostream 頭文件中。
3、<<是流插入運算符,>>是流提取運算符
4、使用C++的cout和cin會比C語言的printf和scanf要方便一點,我們不需要再去使用占位符確定輸出和輸入的數據類型,cout和cin其會自動識別這些數據是什么類型的。
5、在一些算法競賽中,如果要經常進行數據的輸入和輸出的話,那么我們推薦使用C語言的printf和scanf,后面我們會講到。