1. 程式人生 > >C++ Primer 第二章 變數和基本型別 筆記

C++ Primer 第二章 變數和基本型別 筆記

第二章 變數和基本型別 筆記

2.1 基本內建型別

——C++定義了一組整數、浮點數、單個字元和布林值的算術型別,另外還定義了一種稱為void的特殊型別。void型別沒有對應的值,僅用在有有限的一些情況下,通常用作無返回值函式的返回型別。

型別   含義   最小儲存空間

-bool 布林型    ——

-char 字元型     8位

-wchar_t 寬字元型 16位

-short 短整型    16位

-int  整型       16位

-long 長整型      32位

-float 單精度浮點型 6位有效數字

-double 雙精度浮點型 10位有效數字

-long double 擴充套件精度浮點型 10位有效數字

關於內建型別的摘要:

-short、int和long型別都表示整型值,儲存空間的大小不同。一般,short型別為半個機器字長,int型別為一個機器字長,而long型別為一個或兩個機器字長。

-bool型別表示真值true和false。可以將算術型別的任何值賦給bool物件。0值算術型別代表false,任何非0的值代表true。

-unsigned和signed型別有什麼差別?

—前者為無符號型別,只能表示大於或等於0的正數。後者為符號型別,可以表示正數、負數和0。

-一般float型別用一個字(32位)來表示,double型別用兩個字(64)來表示,longdouble型別用三個或四個字(96或128字)來表示。注意:float型只能保證6位有效數字,而double型至少可以保證10位有效數字。所以使用double型別基本上不會錯了。

2.2 字面值常量(字元常量)

整型字面值規則

-以0開頭的字面值整數常量表示八進位制,以0x0X開頭的表示十六進位制

-字面值整數常量的型別預設為int或long型別。

浮點字面值規則

-預設浮點字面值常量為double型別。在數值的後面加上f表示單精度,加上L表示擴充套件精度。

-通常可以用十進位制或者科學技術法表示浮點型常量。

布林字面值和字元字面值

-用true和false表示布林型字面值:bool test =false

-字元型值用一對單引號來定義,如:(‘a’)

轉義字元常量

-都是以反斜線符號開始,如:(\n)

字串常量

-用雙引號括起來的零個或者多個字元表示,如:(“hello world”)

-注意:C++中所有字串常量都由編譯器自動在末尾新增一個空字元(‘\0’)

2.3  變數

-重要:程式中使用變數前必須先定義變數的型別。

-左值(lvalue):可以出現在賦值語句的左邊或右邊。

-右值(rvalue):只能出現在賦值的右邊,不能出現在賦值語句的左邊。

-左值就是變數的地址,右值就是變數的值。

-變數是左值,因此可以出現在賦值語句的左邊。數字常量是右值,因此不能被賦值。

-什麼是變數:具有名字的儲存區,是有名字的物件。

-什麼是物件:記憶體中具有型別的區域,計算左值表示式時就會產生物件。

變數名

-即變數的識別符號,可以由字母、數字和下劃線組成。變數名必須以字母或下劃線開頭,並且區分大小寫字母,如:somename

-注意:識別符號不能包含兩個連續的下劃線,也不能以下劃線開頭後面緊跟一個大寫字母。

-在函式外定義的識別符號不能以下劃線開頭

定義物件

如:intunits_sold;

-以型別名開始 +識別符號+;

-以分號結束定義

初始化

-兩種初始化變數的形式:複製初始化和直接初始化。

如:int ival(1024);-直接初始化

Int ival=1024; -複製初始化

-注意:C++中初始化和賦值是兩種不同操作。

宣告和定義

-變數的定義(definition)用於為變數分配儲存空間,還可以為變數指定初始值。在一個程式中,有且只僅有一個定義。

-宣告(declaration)用於向程式表明變數的型別和名字。

-定義也是宣告:當定義變數時我們聲明瞭它的型別和名字。

-不定義變數的宣告包括物件名、物件型別和物件型別前關鍵字extern

-如,extern int i;聲明瞭變數名i並不定義它。

-extern宣告不是定義,也不分配空間。

-只有當宣告也是定義是,宣告才可以有初始化式,因為只有定義才能分配儲存空間。

-只有當extern宣告位於函式外部時,才可以含有初始化式。

名字作用域

-區域性變數:函式內部定義,還有語句作用域

-全域性變數:函式外變數

2.4  const限定符

-const是關鍵字,用來定義常變數,即把一個物件轉換成一個常量。

-註解:因為常量再定義後就不能被修改,所以定義時必須初始化。

-通過指定const變數為extern,就可以在整個程式中訪問const物件,否則const變數只能是區域性變數。

-註解:非const變數預設為extern,要使const變數能夠在其他的檔案中訪問,必須顯式地指定它為extern。

2.5  引用

-重要概念:引用只是物件的另一個名字。

-是一種複合型別(compound type),新增“&”來定義

-引用必須用於該引用同類型的物件初始化:

int ival=1024;

int &refval=ival;

關於const引用

-const引用是指向const的引用

如:const intival=1024;

const int&refval=ival;   可以讀取但不能修改refval,

-const引用可以初始化為不同型別的物件或者初始化為右值。

-註解:非const引用只能繫結到與該引用同類型的物件。

const引用則可以繫結到不同但相關的型別的物件或繫結到右值。

typedef名字

-用來定義型別的同義詞:typedef double wages;//wages是double的同義詞

-typedef通常被用於以下三種目的:

為了隱藏特定型別的實現,強調使用型別的目的。

簡化複雜的型別定義,使其更易理解。

允許一種型別用於多個目的,同時使得每次使用該型別的目的明確。

列舉(enum)

定義和初始化列舉

如:enumopen_modes(input,output,append);

包括以下幾個部分:

關鍵字enum,其後是一個可選的列舉型別名,和一個用花括號括起來、用逗號分開的列舉成員列表。

-用來初始化列舉成員的值必須是一個常量表達式。

類型別

-類定義以關鍵字class開始,其後是該類的名字識別符號。類體位於花括號裡面。

-注意:花括號後面必須要跟一個分號。

如:

      class Sales_item{

public:

      //operations on Sales_item objects willgo here

private:

std::string isbn;

unsigned units_sold;

double revenne;

};

解析:publicprivate被稱為成員訪問限定符,用它們來宣告各成員的訪問屬性。

花括號裡面的是類體,類體定義了組成該型別的資料作。

-操作稱為成員函式,資料則稱為資料成員

-注意:結構體(struct)跟類(class)的不同,它們定義類的唯一差別在於預設訪問級別:預設情況下,struct的成員是public,而class的成員為private。還有一點,結構體沒有建構函式。

編寫自己的標頭檔案

-標頭檔案一般包含類的定義、extern變數的宣告和函式的宣告。

標頭檔案的正確使用能夠帶來兩個好處:

保證所有檔案使用給定實體的同一宣告;

當宣告需要修改時,只有標頭檔案需要更新;

-標頭檔案用於宣告而不是用於定義

-標頭檔案可以定義類、值在編譯就已知道的const物件和inline函式。

-一些const物件定義在標頭檔案中為了是編譯器能夠看見其初始化式。

-如果const變數不是用常量表達式初始化,那麼它不應該在標頭檔案中定義。

前處理器的簡單介紹

-#include指示只接受一個引數:標頭檔案名

-重要:設計標頭檔案時,應使其可以多次包含在同一個原始檔中。

-前處理器變數有兩種狀態:已定義或未定義。

#define指示接受一個名字並定義該名字為前處理器變數

#ifndef指示檢測指定的前處理器變數是否未定義。如果未定義,那麼跟在其後的所有指示都被處理,直到出現#endif

注:如果標頭檔案名括在尖括號(<  >)裡,那麼認為該標頭檔案是標準標頭檔案。

如果標頭檔案名括在一對引號裡,那麼認為它是非系統標頭檔案。

總結:

本章的筆記到這裡就是全部內容了,因為之前有一定的基礎,學起本章來並不會吃力,我發現這本書的一些名稱和叫法跟之前學譚伯伯的有些差別,對我來說,我更願意譚伯伯那種叫法,比較通俗易懂,開始慢慢發現這本書有些東西解析複雜化了,新接觸了一些新術語和內容,要我一下子能很好掌握,對我來說是一個挑戰,為了能避免自己遺忘得太快,沒結束一章,在三天內做筆記,把重要內容摘錄下來。