第二章 變量和基本類型 筆記
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開頭的字面值整數常量表示八進制,以0x或0X開頭的表示十六進制、
-字面值整數常量的類型默認為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;
};
解析:public和private被稱為成員訪問限定符,用它們來聲明各成員的訪問屬性。
花括號裡面的是類體,類體定義了組成該類型的數據和操作。
-操作稱為成員函數,數據則稱為數據成員
-注意:結構體(struct)跟類(class)的不同,它們定義類的唯一差別在於默認訪問級別:默認情況下,struct的成員是public,而class的成員為private。還有一點,結構體沒有構造函數。
編寫自己的頭文件
-頭文件一般包含類的定義、extern變量的聲明和函數的聲明。
頭文件的正確使用能夠帶來兩個好處:
保證所有文件使用給定實體的同一聲明;
當聲明需要修改時,只有頭文件需要更新;
-頭文件用於聲明而不是用於定義
-頭文件可以定義類、值在編譯就已知道的const對象和inline函數。
-一些const對象定義在頭文件中為了是編譯器能夠看見其初始化式。
-如果const變量不是用常量表達式初始化,那麼它不應該在頭文件中定義。
預處理器的簡單介紹
-#include指示只接受一個參數:頭文件名
-重要:設計頭文件時,應使其可以多次包含在同一個源文件中。
-預處理器變量有兩種狀態:已定義或未定義。
#define指示接受一個名字並定義改名字為預處理器變量。
#ifndef指示檢測指定的預處理器變量是否未定義。如果未定義,那麼跟在其後的所有指示都被處理,直到出現#endif。
注:如果頭文件名括在尖括號(< >)裡,那麼認為該頭文件是標准頭文件。
如果頭文件名括在一對引號裡,那麼認為它是非系統頭文件。
總結:
本章的筆記到這裡就是全部內容了,因為之前有一定的基礎,學起本章來並不會吃力,我發現這本書的一些名稱和叫法跟之前學譚伯伯的有些差別,對我來說,我更願意譚伯伯那種叫法,比較通俗易懂,開始慢慢發現這本書有些東西解析復雜化了,新接觸了一些新術語和內容,要我一下子能很好掌握,對我來說是一個挑戰,為了能避免自己遺忘得太快,沒結束一章,在三天內做筆記,把重要內容摘錄下來
摘自:wwj的夢想之路