目錄
- 一、C++的發展歷史
- 二、C++學習書籍推薦
- 三、C++的第一個程序
- 1、命名空間`namespace`
- 2、命名空間的使用
- 3、頭文件`<iostream>`是干什么的?
個人主頁<—請點擊
C++專欄<—請點擊
一、C++的發展歷史
C++
的起源可以追溯到1979
年,當時Bjarne Stroustrup
(本賈尼·斯特勞斯特盧普)在貝爾實驗室從事計算機科學和軟件工程的研究工作。面對項目中復雜的軟件開發任務,特別是模擬和操作系統的開發工作,他感受到了現有語言(如C語言)在表達能力、可維護性和可擴展性方面的不足。
1983
年,Bjarne Stroustrup
在C語言的基礎上添加了面向對象編程的特性,設計出了C++
語言的雛形,此時的C++
已經有了類、封裝、繼承等核心概念,為后來的面向對象編程奠定了基礎。這?年該語言被正式命名為C++
。在隨后的幾年中,C++
在學術界和工業界的應用逐漸增多。?些大學和研究所開始將C++
作為教學和研究的首選語言,而?些公司也開始在產品開發中嘗試使用C++
。這?時期,C++
的標準庫和模板等特性也得到了進?步的完善和發展。
C++
的標準化工作于1989
年開始,并成立了?個ANSI
和ISO
(International Standards Organization
)國際標準化組織的聯合標準化委員會。1994
年標準化委員會提出了第一個標準化草案。在該草案中,委員會在保持斯特勞斯特盧普最初定義的所有特征的同時,還增加了部分新特征。
在完成C++
標準化的第?個草案后不久,STL
(Standard Template Library
)是惠普實驗室開發的?系列軟件的統稱。它是由Alexander Stepanov
、Meng Lee
和David R Musser
在惠普實驗室工作時所開發出來的。在通過了標準化第?個草案之后,聯合標準化委員會投票并通過了將STL
包含C++
標準中的提議。STL
對C++
的擴展超出C++
的最初定義范圍。雖然在標準中增加STL是個很重要的決定,但也因此延緩了C++
標準化的進程。
1997年11月14日,聯合標準化委員會通過了該標準的最終草案。1998
年,C++
的ANSI/IS0
標準被投入使用。
Bjarne Stroustrup:
上面這副圖片是C++
的版本更新情況,字體越大代表更新的力度越大,目前C++26
預計在2026
年公布。
二、C++學習書籍推薦
C++ Primer
:主要講解語法,經典的語法書籍,前后中期都可以看。STL源碼剖析
:主要從底層實現的角度結合STL
源碼,庖丁解牛式剖析STL
的實現,是侯捷老師的經典之作。Effctive C++
:本書也是侯捷老師翻譯的,本書有?句評價:把C++程序員分為看過此書的和沒看過此書的。
三、C++的第一個程序
在學習C語言
的時候我們打印的第一個程序就是hello world!
,所以我們C++的第一個程序也從它開始,C++
兼容C語言
絕大多數的語法,所以C語言
實現的hello world!
依舊可以運行,這里我們就不用C語言
實現了,我們來看看C++
怎么寫,C++
中需要把定義文件
代碼后綴改為.cpp
。
C++:
#include <iostream>
using namespace std;int main()
{cout << "hello world!" << endl;return 0;
}
這就是C++版本的hello world!
了。
運行結果:
剛從C語言接觸到C++,這里的大部分東西,我們都看不懂,沒有關系,接下來我會一一講解。
1、命名空間namespace
在C/C++
中,變量、函數和后面要學到的類都是大量存在的,這些變量、函數和類的名稱將都存在于全局作用域中,可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化,以避免命名沖突或名字污染,namespace
關鍵字的出現就是針對這種問題的。
C語言中的命名沖突:
我們知道在C語言中qsort
是函數,假設我將它定義成int
類型的全局變量,然后我不包含頭文件<stdlib.h>
,我們執行下面的代碼:
#include <stdio.h>int qsort = 10;int main()
{printf("%d", qsort);return 0;
}
執行結果:
之后我再加上頭文件<stdlib.h>
,執行結果:
程序就會出現這樣的報錯,因為函數在全局變量中發現了兩個這樣的變量名稱,這就導致了命名沖突問題,而我們今天要講的命名空間就是專門解決這個問題的。
注:只有將qsort
定義成全局變量時,才會出現這樣的錯誤,因為當它為局部變量時,打印的時候,程序會首先在局部域尋找變量,當它在局部域中找到后,就不會前往全局域尋找,就不會引發命名沖突了。
命名空間解決該問題的思路呢也很簡單,舉個生活中常見的例子,假設你家的大黃和鄰居家的大黃一摸一樣,而且都叫大黃,總是分不清誰是誰,解決這個問題只需要在狗的身上做個標記,比如讓它戴個牌子就可以分清楚了,命名空間解決命名沖突的問題和這個類似,就是定義一個空間然后把沖突的變量,放進這個空間就可以了。
#include <stdio.h>
#include <stdlib.h>namespace qs
{int qsort = 10;
}int main()
{printf("%d",qs::qsort);return 0;
}
測試結果:
這里由于我們定義了一個命名空間,而訪問這個空間需要一些小的操作,即用命名空間::成員名
的方式訪問指定命名空間中的成員。::
是作用域解析運算符。
當::變量名
這樣使用時表示全局作用域,即可以訪問全局變量。
如上圖,當我放開時,它就會訪問全局變量中的qsort
函數。
注意:
- 定義命名空間,需要使用到
namespace
關鍵字,后面跟命名空間的名字,然后接?對{}
即可,{}
中即為命名空間的成員。命名空間中可以定義變量/函數/類型等 namespace
本質是定義出?個域,這個域跟全局域各自獨立,不同的域可以定義同名變量,所以qsort
不再沖突了namespace
只能定義在全局,當然它還可以嵌套定義。- 項目工程中多文件中定義的同名
namespace
會認為是?個namespace
,不會沖突。 C++
標準庫都放在?個叫std(standard)
的命名空間中。(也就是我們打印程序中用到的std)。
2、命名空間的使用
編譯查找?個變量的聲明/定義時,默認只會在局部或者全局查找,不會到命名空間里面去查找。
例如:
#include <stdio.h>namespace test
{int a = 100;int b = 200;
}int main()
{printf("%d", a);return 0;
}
以上代碼會出現一下錯誤:
- 解決方案1:指定命名空間訪問
#include <stdio.h>namespace test
{int a = 100;int b = 200;
}int main()
{printf("%d", test::a);return 0;
}
- 解決方案2:
using
將命名空間中某個成員展開,項目中經常訪問的不存在沖突的成員推薦這種方式
#include <stdio.h>namespace test
{int a = 100;int b = 200;
}using test::a;
int main()
{printf("%d",a);return 0;
}
- 解決方案3:展開命名空間中全部成員,項目不推薦,沖突風險很大,日常小練習程序為了方便推薦使用。
#include <stdio.h>namespace test
{int a = 100;int b = 200;
}using namespace test;
int main()
{printf("%d",a);return 0;
}
我們的打印程序就是使用的方案3,將C++
標準庫全部展開了,即using namespace std;
。
3、頭文件<iostream>
是干什么的?
在C++
編程語言中,<iostream>
是一個標準庫頭文件,它的主要作用是實現基本的輸入輸出功能,包含了輸入輸出流相關的定義和聲明。
其中定義了std::cin
(標準輸入流對象)相當于C語言中的scanf
,定義了std::cout
(標準輸出流對象)相當于C語言中的printf
等等。
std::cin
是istream
類的對象,它主要面向窄字符(narrow characters (of type char))
的標準輸入流。std::cout
是ostream
類的對象,它主要面向窄字符的標準輸出流。std::endl
是?個函數,流插入輸出時,相當于插入?個換行字符加刷新緩沖區。
我們在實現第一個程序的時候發現其中有<<
符號,這個操作符是流插入運算符
,被用于向輸出流中去插入數據,相對的>>
是流提取運算符
,被用于從輸入流中提取數據。
我們還從程序中發現C++
中打印時沒有使用%d、%f
這些符號,這是因為cout
在輸出時會自動識別數據類型,進行相應的轉換和輸出,不容易出現因格式化字符串與實際數據類型不匹配而導致的錯誤。而C語言使用%d
時,如果不小心將其他類型的數據以 %d
格式輸出,可能會導致錯誤的結果或程序崩潰。
總結:
以上就是本期博客分享的全部內容啦!如果覺得文章還不錯的話可以三連支持一下,你的支持就是我前進最大的動力!
技術的探索永無止境! 道阻且長,行則將至!后續我會給大家帶來更多優質博客內容,歡迎關注我的CSDN賬號,我們一同成長!
(~ ̄▽ ̄)~