程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++Primer第5版學習筆記(一),primer學習筆記

C++Primer第5版學習筆記(一),primer學習筆記

編輯:C++入門知識

C++Primer第5版學習筆記(一),primer學習筆記


C++Primer第5版學習筆記(一)

第一、二章的重難點內容

       本篇文章主要記錄了我在學習C++Primer(第5版,中文版)中遇到的重難點及其分析。因為第一、二章比較簡單,因此這裡合並這兩章我遇到的問題。

       第一章 開始

       這一章在第一部分之前,是一個helloworld式的章節,包含基本的函數,io流以及類的介紹。

       知識點1:P19,1.5,文件重定向

       可以在windows下的cmd中或者mac,linux系統的終端窗口中用輸入命令的形式執行程序並使它從一個文件中讀入數據,再把標准輸出改為輸出到另一個文件裡。

       如果我們編譯好的程序為a.exe,程序需要輸入兩個整數,整數之間用逗號間隔,然後需要檢測到EOF(End_Of_File,文件結束符)程序才會停止。這時為了文件重定向,我們可以新建一個文本文檔(b.txt),接著我們在文檔裡記錄”1,2“然後保存起來,保存後系統會在這個文件的末尾自動添加文件結束符。然後再新建一個空白文本文檔(c.txt),使a.exe,b.txt,c.txt在同一個目錄下。這時打開終端,轉到這個目錄,輸入a <b.txt>c.txt回車確認。之後我們就實現了文件重定向了。

      但是不被緩沖的cerr的數據沒法被重定向到指定文件裡。

      (交叉引用:P23,第一章小結)cerr和clog的內容都不會馬上輸出,都會先被存儲到緩存區裡面,因此你可以在緩存區被刷新之前,指定(重定向)它們輸出的位置。而cerr是直接輸出的,因此只能做標准輸出,不能重定向。讀cin,程序意外終止,使用endl都會刷新緩存區。

       第I部分:C++基礎

       第二章  變量和基本類型

       C++Primer由四部分組成,這裡是比較基礎的第一部分,這部分共有六章。

       第二章主要講變量,變量類型,定義變量的各種情況和規則以及變量之間互相轉換的規則。

       知識點2:P30,2.1.1,C++語言關於類型的規定

       C++語言的基本類型的設定與硬件緊密相關,因此很多類型的內存尺寸也都只是給了一個范圍,其實各家IDE(LLVM,GCC,Visaul C++)的實現都是在范圍內,具體的實現細節都是不確定的。

       其中bool最小尺寸未定義,char最小尺寸是8位,wchar_t和char16_t的最小尺寸都是16位,char32_t的最小尺寸是32位,int的最小尺寸是16位,long和long long的最小尺寸分別是32位和64位,對於浮點型數據的表現尺寸是按照精度計算的,其中float的最小尺寸精度是小數點後6位,double和long double的最小尺寸精度則是小數點後10位(實際可能比這個精度要大一些)。int不得小於short,long不得小於int,long long不得小於long。float,double,long double也應該是精度遞增(或者相同)的關系。

       知識點3:P32,2.1.2,類型轉換

       程序自動執行的類型轉換操作發生在程序裡IDE預期我們使用A類型但是實際上我們使用B類型的時候,B類型的對象會自動轉換為A類型的,如果沒法轉換,程序就會報錯。

       我們先看賦值操作裡表達式裡面發生的自動轉換,賦值操作A=B中,等號左邊的A被叫做左值,B被叫做右值,程序期待事情是你給定的右值和左值類型完全相同。如果不相同,這裡就會發生強制的類型轉換,即把B的類型轉化為A的類型。如果把一個超出左值類型表達范圍的數賦值給左值,左值又是一個無符號類型,比如unsigned char c=-1;這時-1(整型,負的)會轉化為無符號字符型,初始值對無符號類型表示數值總數取模,然後求余數,這個余數就是轉化後的數。

       因為C++沒有明確規定有符號類型的數應該如何表示,因此如果把一個超出左值類型表達范圍的數賦值給左值,左值又是一個有符號類型,這種行為的結果是不一定的。我們把這種不確定造成結果行為叫做未定義行為。

        知識點4:P36,2.1.3,轉義序列

       字符的轉義序列可以為\後面加上最多3個8進制數字,或者\x後面加上多個16進制數字,那麼當我們寫"cout<<"\01234"<<endl;"時會發生什麼呢,首先,\後面緊挨著的三位(012)中的12不會被當作8進制數,會被當成十進制的12,而剩下的無論是什麼都會被當作普通的字符。這裡因為012是\後面的數字,所以會被當作8進制數12,對應的10進制的ASCII碼表是換行符。因此輸出為\n34。"\012,34"和"\12,34"是等價的。當然,超出字符范圍的數字,也就無法被轉義了。

        知識點5:P55,2.4.1,const的引用和指針

        const是用來聲明常量的標識符,代表我們不能夠使用const後聲明的變量名更改變量的值。如有前提const int i=32;,則之後給i賦值的語句就都是錯誤的。但是在int a=0;const int &p=a;的前提下,給a賦值的語句卻是正確的,因為a不被const修飾而聲明,這僅僅意味著,我們不能夠通過p這個名稱更改p的實體——a的值。由此可見,我們允許把引用綁定到const對象上,但是必須用const int &i=ci;這種形式,其中ci可以是也可以不是一個const對象,但是這個綁定操作之後i的值是不可更改的。

         對一個常量的訪問也可以用指向常量的引用或者指向常量的指針實現,不同的是,指向常量的引用是常量的一個別名,不能夠被賦值,不過指向常量的指針本身是一個對象,它的本身值可以更改,不過指向的對象的值不能夠被更改。

        如果不想讓指針指向的對象被更改,可以用const指針,int a=1;int *const p=a;這樣指針本身的值不可以被改變但是它指向的對象的值是可以被改變的。如const int *const p=a;這種語句使指針本身和它指向的對象值都不會被改變。

        知識點6:P57,2.4.3,頂層const

      頂層const是對const而言的,“頂層”可以用來修飾const狀態的形容詞。一個const使對象本身的值固定,這個const就被稱為頂層const,一個const是對象指向或引用的對象成為固定值,這個const就被稱為底層const。頂層和底層const對拷貝來說密切相關,有相同底層const資格的兩個對象才能夠互相拷貝,而且頂層const聲明變量之後不允許再次改變const的值。

      像int v1=9;const int *p=&v1;int *p2=p;這種語句如果能夠通過編譯,那麼我們就可以使用p2的性質改變p1指向的常量的值,但是常量的值是不能夠被改變的,因此這種變相改變常量的值的表達式都是錯誤的。可以通過分析const級別得到表達式中常量是否被更改,從而判斷語句的正確性。

      說到底,頂層底層說的是對拷貝控制的約束。總的規則就是“不能改變常量的值”。因此“拷入和拷出的對象都要有相同的底層const資格,或者兩個對象數據類型必須能轉換”,例如,有int *p1,const int *p2;。p1沒有底層const,p2有底層const。p1=p2;這時const int*不能轉換成int *(如果轉換,就違反了“不能改變常量的值這一約束條件”),因此p1=p2;不合法。p2=p1;int * 能夠轉換成const int *,因此p2=p1合法。

      知識點7:P58,2.4.4,constexpr

      我們在了解constexpr之前,應該先了解常量表達式。所謂常量就是固定的量,那麼常量表達式就是值固定不變的表達式,這裡“值固定不變”,指的是程序編譯階段,常量表達式的值就能被確定下來之後也不能對其進行任何種方式的修改。因此這個固定,是編譯之後固定的。像cout<<1234<<endl;中的1234,就是常量表達式,顯然,字面值是常量表達式。

       constexpr的作用之一就是幫助程序員在IDE的提示下查看一個賦值語句是不是常量表達式。使用的方式包含在聲明語句裡面,形如constexpr 變量類型 變量名=右值;如果右值是一個常量,這條語句就是正確的。在所有函數體外聲明的全局變量的地址就符合“在編譯期間能確定,編譯後值不被改變”這兩個條件,因此也屬於常量。

    另外,用constexpr聲明的指針(比如,constexpr int *p=&v1;中的*p,相當於int *const p=&v1;    )都是頂層const,即指針本身值固定。

      知識點8:P61,2.5.2,auto和decltype類型聲明/指示符

      auto變量通過初始化語句,計算出右值的類型,並推導出左值的類型。這個過程中auto將會忽視頂層const和引用類型,可用const auto &a=i;這種方式顯式地指出了:指出要推導的結果是帶頂層指針屬性的或者是引用屬性的。auto推導多個值時,這些值的類型必須是一樣的。

       decltype不通過計算,只通過推算出變量應有的值,表達式本身應有的值和函數的返回值來推導類型。對於變量類型,decltype保留頂層const和引用的屬性。對於表達式,解引用表達式(如:int i=1;   int *p=&i;    decltype (*p) a=i;中的*p,對p解引用是int &類型的)和帶括號的表達式,(如:decltype ((a+1)) c=i;)的結果都將是引用類型。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved