1. 程式人生 > >C++詳細學習筆記(一)

C++詳細學習筆記(一)

首先,本次學習主要參考的書籍是C++Primer Plus第六版,為了方便今後參閱,故寫下該學習筆記。C++是在C語言基礎上開發的一種集面向物件程式設計、泛型程式設計和過程化程式設計於一體的程式語言,是C語言的超集。一、預備知識      C++有三件法寶:1、繼承了C語言高效、簡潔、快速和可移植性的傳統(C代表的過程性程式設計);2、面向物件的特性帶來了全新的程式設計方法,這種方法是為了應付複雜程度不斷提高的現代程式設計任務而設計的;3、C++的模板特性提供了另一種全新的程式設計方法—泛型程式設計。      (1)C++簡史    20世紀70年代,C和Pascal語言引領人們進入結構化程式設計時代,其中C還能生成簡單、快速執行的程式,並提供了處理硬體問題的能力,如管理通訊埠和磁碟驅動器,使得C成為20世紀80年代佔統治地位的程式語言,這段時間同時見證了OOP的發展。       20世紀70年代早期,貝爾實驗室的Dennis Ritchie致力於開發UNIX作業系統(所謂作業系統是能夠管理計算機資源、處理計算機與使用者之間互動的一組程式),為了完成這項工作,Ritchie需要一種語言,不僅要生成簡潔、快速的程式,並能有效地控制硬體。傳統的方法是使用匯編語言,但這是一種低階語言,不僅直接操作硬體,而且依賴於計算機的內部機器語言,無法在不同的計算機平臺工作,這就需要一種高階語言和編譯器程式。因此C就是融合了這兩種特性,不僅具有低階語言的效率、硬體訪問能力,而且具有高階語言的通用性、可移植性。       (2)C語言程式設計原理       計算機語言要處理兩個概念——資料和演算法(程式)。資料是程式使用和處理的資訊,演算法是程式使用的方法。C語言剛出世的時候也是過程性的語言,這意味著它強調的是程式設計的演算法方面。從概念上說,過程化程式設計首先要確定計算機應採取的操作,然後使用程式語言來實現操作。隨著規模擴大,就會形成像“義大利麵條式程式設計”這樣的情況。         因此引入結構化程式設計以及自頂向下的原則,即將大型的程式分解成小型,便於管理的任務。     (3)面向物件程式設計       面向物件程式設計強調的是資料。OOP不像過程性程式設計那樣,試圖使問題滿足語言的過程性方法,而是試圖讓語言滿足問題的要求,其理念是設計與問題本質特性相對應的資料格式。      所以在C++中,類是一種規範,它描述了這種新型資料格式,物件是根據這種規範構造的特定資料結構。通常,類是規定了可使用哪些資料來表示物件以及可以對這些資料執行哪些操作。OOP程式設計方法首先設計類,它們準確表達了程式要處理的東西。然後可以設計一個使用這些類的物件的程式。這體現了一種自下而上的程式設計方法,即從低階組織(類)到高階組織(程式)的處理過程。因為OOP語言使得程式設計師可以輕鬆使用一些已有的類,所以C++真正的優點之一是:可以方便地重用和修改現有地、經過仔細測試的程式碼。       (4)泛型程式設計         泛型程式設計是C++支援的另一種程式設計模式,與OOP的目標相同,但是卻使重用程式碼和抽象通用概念更簡單。不過OOP強調的是程式設計的資料方面,而泛型程式設計強調的是獨立於特定資料型別,它們的側重點不同,OOP是一個管理大型專案的工具,而泛型程式設計提供了執行常見任務的工具,如對資料排序或合併連結串列。術語泛型指的是建立獨立於型別的程式碼。例如,要對不同型別的資料進行排序,通常必須為每種型別建立一個排序函式,泛型程式設計需要對語言進行擴充套件,以便可以只編寫一個泛型函式(即不是特定型別的),並將其用於各種實際型別。C++模板提供了完成這種任務的機制。       (5)C++的起源      與C語言一樣,C++也是在貝爾實驗室誕生的,Bjarne Stroustrup於20世紀80年代在這裡開發出了這種語言。用他自己的話說,“C++主要是為了我的朋友和我不必再使用匯編語言、C語言或其他現代高階語言來程式設計而設計的。它的主要功能是可以方便地編寫出好程式,讓每個程式設計師更加快樂”。       稱C++來自C語言中地遞增運算子++,運算子將變數加1,名稱C++表明,它是C的擴充版本,因為Stroustrup雖然在C上加入了OOP特性和對C的泛型程式設計支援,但是並沒有對C的元件作很大的改動,因此C++是C語言的超集,這意味著任何有效的C程式都是有效的C++程式。C++程式可以使用已有的C軟體庫。其中OOP部分賦予了C++語言將問題所涉及的概念聯絡起來的能力,C部分則賦予了C++語言緊密聯絡硬體的能力,這種能力的結合成就了C++的廣泛傳播。       在C++獲得一定成功後,才新增的模板,這使得進行泛型程式設計成為可能。在模板特性被使用和改進後,然們才意識到它們和OOP一樣重要。       C++融合了OOP、泛型程式設計和傳統的過程性方法,這表明C++強調的是實用價值,而不是意識形態方法。二、C++學習的最基本知識
(1)進入C++        注意點:         1、C++對大小寫敏感,其中編譯器也是對拼寫敏感的;       2、副檔名cpp是一種表示C++程式的常用方法;       3、C++輸入輸出函式為cin和cout函式,但也可使用printf()和scanf()函式,但要包含常規C語言的stdio.h檔案;     4、#include預處理編譯指令、int main()作為介面的函式頭、using namespace編譯指令、結束mian函式的return函式;       5、C++中,語句結束後不能省略分號;       6、如果編譯器到達main()函式末尾時沒有遇到返回函式,則認為main()函式以return 0結尾;       7、程式碼#include <iostream>該編譯指令導致前處理器將iostream檔案的內容新增到程式中,這是典型的前處理器操作:在原始碼被編譯之前,替換或者新增文字;將iostream檔案的內容新增到程式中這一前處理器操作涉及程式與外部世界之間的通訊。iostream
中io指的是輸入和輸出。C++的輸入/輸出方案涉及iostream檔案中的多個定義。#include編譯指令導致iostream檔案的內容隨著原始碼檔案的內容一起被髮送給編譯器。實際上,iostream檔案的內容將取代程式中的程式碼行#include<iostream>。原始檔案沒有被修改,而是將原始碼檔案和iostream組合成一個複合檔案,編譯的下一個階段將使用該檔案。
8、像iostream這樣的檔案叫做包含檔案——由於它們被包含在其他檔案中,也叫標頭檔案——由於它們被包含在檔案的起始處。C++編譯器自帶了很多標頭檔案,每個標頭檔案都支援一組特定的工具。C語言中標頭檔案使用副檔名h,在C++中,對老式C的標頭檔案保留了副檔名h,即C++也可以使用這種檔案,但是C++風格的標頭檔案是沒有副檔名的,有些C標頭檔案被轉換時,會進行重新命名,去掉副檔名h,並在檔名稱前加上字首c,如math.h->cmath。有時C標頭檔案的C版本和C++版本相同,而有時新版本做了一些修改。對於純粹的C++標頭檔案來說,去掉h不只是形式上的改變,沒有h的標頭檔案也可以包含名稱空間。       9、如果使用iostream,而不是iostream
.h,則應使用using namespace std的名稱空間編譯指令來使iostream中的定義對程式可用。名稱空間支援是一項C++特性,旨在讓你編寫大型程式以及將多個廠商現有的程式碼組合起來的程式時更容易,它有助於組織程式。一個潛在的問題是,可能使用兩個已封裝好的產品,而它們都包含一個名為wanda()函式,這樣,使用wanda()函式時,編譯器將不知道指的是哪個版本,名稱空間讓廠商能夠將其產品封裝在一個叫做名稱空間的單元中,這樣就可以使用名稱空間來指出想使用哪個廠商的產品。因此,Microflop Industries可以將其定義放到一個名為Microflop的名稱空間中,這樣其wanda()函式的全稱為Microflop::wanda();這樣,程式就可以使用名稱空間來區分不同的版本了。按這種方式,類、函式和變數便的是C++編譯器的標準組件,它們現在都被放置在名稱空間std中,這意味著在iostream中定義的用於輸出的cout變數實際上是std::cout,因此可以省略編譯指令using。      10、對於cout<<"Come up";語句來說,從概念上看,輸出是一個流,即從程式流出的一系列字元。cout物件表示這種流,其屬性是在iostream檔案中定義的。cout的物件屬性包含一個插入運算子<<,它可以將其右側的資訊插入到流中。     11、endl控制符,其重起一行的作用,和cout一樣,endl也是在標頭檔案中定義的,且位於名稱空間std中。其中所謂的控制符是像endl一樣對cout來說有特殊含義的特殊符號。C++中還提供了一種在輸出中指示換行的舊方法,就是在“/n”,一般將其放在字串的引號中,兩者之間的區別在於,endl確保程式繼續執行前重新整理輸出(將其立即顯示在螢幕上),而使用“\n“不能提供這樣的保證,這意味著在有些系統中,有時可能在你輸入資訊後才出現提示。  12、原始碼中的標記和空白。標記是指一行程式碼中不可分割的元素,空白則是空格、製表符和回車的統稱。標記之間一般用空白來分開。   13、宣告不一定是定義,在C++中儘可能首次使用變數前宣告它,這意味著將導致編譯器為變數分配記憶體空間,而C中所有變數的宣告通常都位於函式或過程的開始位置。     14、對於類ostream和istream類,從技術上說,它們並沒有被內建到C++語言中,而是語言標準指定的類,這些類的定義位於iostream檔案中,沒有被內建到編譯器中。       15、類描述了可對類物件執行的所有操作,要對特定物件執行這些允許的操作,需要給該物件傳送一條資訊。C++提供了兩種傳送訊息的方法:一種是使用類方法;另一種方式是重新定義運算子,cin和cout採用的就是這種方式。

      16、例如x=sqrt(6.25),表示式sqrt(6.25)被稱為函式呼叫,被呼叫的函式叫做被呼叫函式,包含函式呼叫的函式叫做呼叫函式。對於有返回值的函式來說,函式執行完畢後,語句中的函式呼叫部分將被替換為返回值。因此在使用函式之前,C++編譯器必須知道函式的引數型別和返回值型別。如果缺少這些資訊,編譯器將不知道如何解釋返回值。C++提供這種資訊的方式就是使用函式原型語句。例如sqrt()的函式原型就像這樣:double  sqrt(double);函式原型之於函式就像變數宣告至於變數——指出涉及的型別。原型結尾的分號表明它是一條語句,這使得它是一個函式原型,而不是函式頭。如果省略分號,編譯器將這行程式碼解釋為一個函式頭,並要求接著提供定義該函式的函式體。但不要混淆函式原型和函式定義,原型只描述函式介面,它描述的是傳送給函式的資訊和返回的資訊,而定義中包含了函式的程式碼。C和C++將庫函式的這兩項特性分開了,庫函式中包含了函式的編譯程式碼,而標頭檔案只包含了原型。

     17、函式變體:有多個引數,如 double pow(double,double);不接受任何引數,如int rand(void);沒有返回值,如void bucks(double),這個函式是將數字以美元、美分的格式顯示在螢幕上,由於這個函式把值傳送給螢幕,而不是呼叫函式,因此不需要返回值,也不能將該函式呼叫放在賦值語句或其他表示式中。相反,應使用一條純粹的函式呼叫語句:bucks(1234.56)。

      18、對於main()函式來說,main函式是一個有返回值函式,所以需要使用關鍵字return來提供返回值,並結束函式,這就是為什麼在main()函式結尾使用語句:return 0;的原因,但是這個返回值到底是返回到哪裡了呢?事實上,可以將計算機作業系統看成是呼叫程式,因此main()函式的返回值並不是返回給程式的其他部分,而是返回給作業系統。

        19、讓程式訪問名稱空間std的方法有多種,下面是其中4種:(1)將using namespace std;放在函式定義之前,讓檔案中所有函式都能使用名稱空間std中所有元素;(2)將using namespace std;放在特定的函式定義中,讓該函式能夠使用名稱空間std中的所有元素;(3)在特定的函式中使用類似using std::cout;這樣的編譯指令,而不是using namesapce std;,讓該函式能夠使用指定的元素,如cout。(4)完全不使用編譯指令using,而在需要使用名稱空間std中的元素時,使用字首std::,如下所示:std::cout<<"     "<<std::endl。

、總結

1、有多種型別的C++語句,包含下述6種:宣告語句、賦值語句、訊息語句:將訊息傳送給物件,激發某種行動。、函式呼叫、函式原型、返回語句。

2、C++提供了兩個用於處理輸入和輸出的預定義物件(cin和cout),它們是istream和ostream類的例項,這兩個類是在iostream檔案中定義的。為ostream類定義的插入運算子(<<)使得將資料插入到輸出流成為可能;為istream類定義的抽取運算子(>>)能夠從輸入流中抽取資訊。cin和cout都是智慧物件,能夠根據程式上下文自動將資訊從一種形式轉換為另一種形式。

3、C++可以使用大量的C庫函式,要使用庫函式,應當包含提供該函式原型的標頭檔案。

相關推薦

C++詳細學習筆記

首先,本次學習主要參考的書籍是C++Primer Plus第六版,為了方便今後參閱,故寫下該學習筆記。C++是在C語言基礎上開發的一種集面向物件程式設計、泛型程式設計和過程化程式設計於一體的程式語言,是C語言的超集。一、預備知識      C++有三件法寶:1、繼承了C語言高

c 語言學習筆記基礎

lac alert https 內容 con 標記 prime c++ prime c基礎 近期工作上有對C語言算法上的需求,所以要學C,上學的時候沒學過,只學過半年的Java(我是專升本,本科學的材料),2015年工作後也學過C,那時候的需求是能看懂就可以,也就沒深入研究

深入理解C指標學習筆記

第一章 認識指標 指標在C和C++中隨處可見,它給程式設計師帶來了極大的方便,指標為動態記憶體的分配提供了重要支援。使用指標我們可以方便的操控記憶體,提高程式的執行效率;同時利用指標變數我們可以實現各種資料結構,例如連結串列等;另一方面指標與陣列的表示法

C# Hadoop學習筆記—環境安裝

一、安裝環境 1,前期準備:官網下載“NuGet Package Manager”,按自己已有的VS環境下載對應版本; 3,安裝。 4,通過HDInsight,安裝Windows Azure,目前是預覽版本。 二、測試DEMO using System; using

C# EmguCV學習筆記---影象加減法操作

影象加法: 使用Image.Add()方法,可以讓兩張圖片相加,或者讓當前影象加上一個色彩值,另外你也可以使用CvInvoke.Add()方法執行相同的操作。 Image.Add()方法內部就是呼叫CvInvoke.Add()方法實現的。 Image.Add()有3個實現,

AutoCAD二次開發(.net教程)C#版——學習筆記

        最近開始學習AutoCAD(ObjectARX)的二次開發,首先遇到的一個最大問題就是——開發環境的設定問題,CAD的二次開發對開發工具的版本要求很嚴,開發包、CAD版本和開發工具都得對應(在網上看了很多貼了也有人不用對應)。當下C#比較流行的開發工具就是V

C語言學習筆記—— 初識C語言並寫一個簡單的C語言程式

1、目的碼檔案、可執行檔案、庫用C語言編寫程式時,編寫的內容被儲存在文字檔案中,該檔案被稱為原始碼檔案,檔案以.c結尾。目標檔案和可執行檔案都是由機器語言指令組成的,但是目標檔案只包含編譯器為你編寫的程式碼翻譯的機器語言程式碼,可執行檔案還包含你編寫的程式中使用的庫函式和啟動

【EOS學習筆記】linux下的C++程式設計師的春天,附EOS環境安裝詳細步驟

在參加了4月28日柏鏈道捷組織的EOS沙龍後,對linux下c/c++程式設計師來說,彷彿深夜裡點亮了一盞明燈,EOS在6月份主網上線,目前智慧合約只能使用c/c++編寫,門檻不低,而且需要使用很多unix命令,這個對linux程式設計師來說簡直就是量身打造的!      學

C#可擴展編程之MEF學習筆記:MEF簡介及簡單的Demo

com ring this exec hosting code .cn 引用 展開 在文章開始之前,首先簡單介紹一下什麽是MEF,MEF,全稱Managed Extensibility Framework(托管可擴展框架)。單從名字我們不難發現:MEF是專門致力於解決擴展性

C++學習筆記——一個字符串分割和統計的工具TextUtils

發生 插入 exit 大小 按行讀取 位置 n) fstream ostream 第一講先從一個實例開始——我們需要完成一個遍歷文件並統計單詞出現次數的任務。分解功能:首先,按行讀取文件並舍棄可能的空行。其次,將每一行都按照空格劃分單詞。因為可能存在標點符號,我們還需要將標

C學習筆記-程式設計作業

C學習筆記(一)-程式設計作業 第十一週作業: [Loop]雙基迴文數 [Loop]校門外的樹 [Algorithm]約瑟夫環 [Recursion] 漢諾塔 [Algorithm]紀念郵票 [algorithm]

C++學習筆記

在C++程式中,定義main函式和定義其他函式一樣。定義函式必須指定四個元素:返回型別、函式名、圓括號內的形參表(可能為空)和函式體。 main函式的返回值必須是int型別,int型別是內建型別。 關於函式的編譯:在Linux系統下,呼叫g++編譯器——>g++ p

北京大學MOOC C++學習筆記

引用: 定義引用時一定要將其初始化成引用某個變數。 初始化後,它就一直引用該變數,不會再引用別的變量了。 引用只能引用變數,不能引用常量和表示式。 double a = 4, b = 5; double & r1 = a; double & r2 = r

C++學習筆記資料型別、資料處理、複合型別、迴圈、分支

     過段時間打算上手OpenCV,自己不是特別喜歡Python這個語言,幹嵌入式時間久了還是對C有種執念,同時C++在嵌入式應用以及影象處理方面也是有很大佔有量的,所以從國慶假期開始上手C++,當然學好C++絕非短時間能辦到的,這需要大量的練習和使用,給自己加個油吧,不

C# WPF 基礎教程 視訊學習筆記

1.[STAThread()] 代表單執行緒 2.using語句允許程式設計師指定使用資源的物件應當何時釋放資源 3.Border 一般用於裝載面板   Padding 邊框和內部內容中間新增空間   CornerRadius可以使邊框具有一個圓角     4.DockP

C++學習筆記——leetcode記錄

C++學習筆記(一)——leetcode記錄 944. Delete Columns to Make Sorted [Easy] 852. Peak Index in a Mountain Array [Easy] 942. DI String

C語言學習入們到精通之學習筆記

為什麼我通過部落格的形式與大家分享我的學習筆記     對於c語言的學習已經有快3年之久了,對於學習嵌入式的我看來,C是我們的根本也就是我們的核心知識點,想學習好嵌入式就必須精通C語言。在一年之前我對C語言的認識只停留在表面,只會用C語言寫寫51微控制器或STM32的控制程

c++學習筆記--計算導論

計算導論 課程來源:coursera:程學設計與演算法(Peking University,北京大學) 課程連結:程式設計與演算法 本章簡介:這是系列課第一節的前半部分,與程式碼關係不大,主要涉及計算機原理、發展歷史與程式原理,瞭解一下即可。 一. 計算機原理 1.1 從數學

c#學習筆記——visual studio 的安裝 與 hello world 程式

visual studio 的安裝 visual studio是微軟提供的一款開發編譯工具它的功能很強大,也可以寫除了c#之外的其他程式,我們以後就用它來寫程式碼。vs共有3個版本,分別為社群版、專業版、企業版,其中社群版是免費的,我們可以使用這個版本。正常情

C++操作Excel學習筆記

C++讀取Excel檔案方式比較 C++讀取Excel的XLS檔案的方法有很多,但是也許就是因為方法太多,大家在選擇的時候會很疑惑。 由於前兩天要做導表工具,比較了常用的方法,總結一下寫個短文, 1.OLE的方式 這個大約是最常用的方式,這個方式其實啟動了一個EXCEL的程序在背後讀寫EXCEL檔案,這