C++ 入门笔记1
一.關于注釋
注釋總是以 /* 開始并以 */ 結束。這意味著,一個注釋對不能出現在另一個注釋對中。由注釋對嵌套導致的編譯器錯誤信息容易使人迷惑。
?
當注釋掉程序的一大部分時,似乎最簡單的辦法就是在要臨時忽略的區域前后放一個注釋對。問題是如果那段代碼已經有了注釋對,那么新插入的注釋對將提前終止。臨時忽略一段代碼更好的方法,是用編輯器在要忽略的每一行代碼前面插入單行注釋。這樣,你就無需擔心要注釋的代碼是否已包含注釋對。
?
二.關于頭文件
標準庫的頭文件用尖括號 < > 括起來,非標準庫的頭文件用雙引號 " " 括起來。
?
?
三.數據類型
表示數值即整數和浮點數的類型。浮點型值有三種類型:long double 、double 和 float,分別表示擴展精度值、雙精度值和單精度值。一般總是使用 double 型。特別地,float 只能保證六位有效數字,這對于大多數的計算來說都不夠。
表示整數、字符和布爾值的算術類型合稱為整型。整型包括 bool、char、wchar_t、short 、int 和 long 字符類型有兩種:char 和 wchar_t。char 類型保證了有足夠的空間,能夠存儲機器基本字符集中任何字符相應的數值,因此,char 類型通常是單個機器字節(byte)。wchar_t 類型用于擴展字符集,比如漢字和日語,這些字符集中的一些字符不能用單個 char 表示。 bool 類型表示真值 true 和 false。可以將算術類型的任何值賦給 bool 對象。0 值算術類型代表 false,任何非 0 的值都代表 true。
整型可以是帶符號或無符號的。
1.除 bool 類型外,整型可以是帶符號的(signed)也可以是無符號的(unsigned)。
2.顧名思義,帶符號類型可以表示正數也可以表示負數(包括 0),而無符號型只能表示大于或等于 0 的數。 整型 int、short 和 long 都默認為帶符號型。
3.要獲得無符號型則必須指定該類型為 unsigned,比如 unsigned long。unsigned int 類型可以簡寫為 unsigned,也就是說,unsigned 后不加其他類型說明符意味著是 unsigned int 。
4.和其他整型不同,char 有三種不同的類型:plain char 、unsigned char 和 signed char。雖然 char 有三種不同的類型,但只有兩種表示方式。可以使用 unsigned char 或 signed char 表示 char 類型。使用哪種 char 表示方式由編譯器而定。
?
四.字面值
1.以 0(零)開頭的字面值整數常量表示八進制,以 0x 或 0X 開頭的表示十六進制. 沒有 short 類型的字面值常量。
2.字面值整數常量的類型默認為 int 或 long 類型。其精度類型決定于字面值——其值適合 int 就是 int 類型,比 int 大的值就是 long 類型。通過增加后綴,能夠強制將字面值整數常量轉換為 long、unsigned 或 unsigned long 類型。通過在數值后面加 L 或者 l(字母“l”大寫或小寫)指定常量為 long 類型。
3.類似地,可通過在數值后面加 U 或 u 定義 unsigned 類型。同時加 L 和 U 就能夠得到 unsigned long 類型的字面值常量。但其后綴不能有空格:
128u /* unsigned */ 1024UL /* unsigned long */1L /* long */ 8Lu /* unsigned long */沒有 short 類型的字面值常量。.4.通常可以用十進制或者科學計數法來表示浮點字面值常量。使用科學計數法時,指數用 E 或者 e 表示。默認的浮點字面值常量為 double 類型。在數值的后面加上 F 或 f 表示單精度。同樣加上 L 或者 l 表示擴展精度(再次提醒,不提倡使用小寫字母l)。下面每一組字面值表示相同的值: 3.14159F .001f 12.345L 0.3.14159E0f 1E-3F 1.2345E1L 0e05.單詞 true 和 false 是布爾型的字面值: bool test = false;可打印的字符型字面值通常用一對單引號來定義:
'a' '2' ',' ' ' // blank這些字面值都是 char 類型的。在字符字面值前加 L 就能夠得到 wchar_t 類型的寬字符字面值。如:
L'a' 6.為了兼容 C 語言,C++ 中所有的字符串字面值都由編譯器自動在末尾添加一個空字符。字符字面值 'A' // single quote: character literal表示單個字符 A,然而
"A" // double quote: character string literal表示包含字母 A 和空字符兩個字符的字符串。
7.處理長字符串有一個更基本的(但不常使用)方法,這個方法依賴于很少使用的程序格式化特性:在一行的末尾加一反斜線符號可將此行和下一行當作同一行處理。
// ok: A \ before a newline ignores the line break std::cou\ t << "Hi" << st\ d::endl;等價于 std::cout << "Hi" << std::endl;注意反斜線符號必須是該行的尾字符——不允許有注釋或空格符。同樣,后繼行行首的任何空格和制表符都是字符串字面值的一部分。正因如此,長字符串字面值的后繼行才不會有正常的縮進。
8.兩個相鄰的僅由空格、制表符或換行符分開的字符串字面值(或寬字符串字面值),可連接成一個新字符串字面值。這使得多行書寫長字符串字面值變得簡單:
// concatenated long string literalstd::cout << "a multi-line ""string literal ""using concatenation"<< std::endl;執行這條語句將會輸出:
a multi-line string literal using concatenation??五.變量
1.C++中的變量名,即變量的標識符,可以由字母、數字和下劃線組成。變量名必須以字母或下劃線開頭,并且區分大小寫字母:C++ 中的標識符都是大小寫敏感的。
2.C++ 支持兩種初始化變量的形式:復制初始化和直接初始化。復制初始化語法用等號(=),直接初始化則是把初始化式放在括號中:
int ival(1024); // direct-initialization int ival = 1024; // copy-initializationC++ 是一種靜態類型語言:變量和函數在使用前必須先聲明。變量可以聲明多次但是只能定義一次。定義變量時就進行初始化幾乎總是個好主意。
3.當一個定義中定義了兩個以上變量的時候,每個變量都可能有自己的初始化式。 對象的名字立即變成可見,所以可以用同一個定義中前面已定義變量的值初始化后面的變量。已初始化變量和未初始化變量可以在同一個定義中定義。兩種形式的初始化文法可以相互混合。
對象可以用任意復雜的表達式(包括函數的返回值)來初始化
4.定義時指定了初始值的對象被稱為是已初始化的。當定義沒有初始化式的變量時,系統有時候會幫我們初始化變量。這時,系統提供什么樣的值取決于變量的類型,也取決于變量定義的位置。
內置類型變量是否自動初始化取決于變量定義的位置。在函數體外定義的變量都初始化成 0,在函數體里定義的內置類型變量不進行自動初始化。除了用作賦值操作符的左操作數,未初始化變量用作任何其他用途都是沒有定義的。未初始化變量引起的錯誤難于發現。
5.C++中的對象:我們遵循更為通用的用法,即對象是內存中具有類型的區域。我們可以自由地使用對象描述程序中可操作的大部分數據,而不管這些數據是內置類型還是類類型,是有名字的還是沒名字的,是可讀的還是可寫的。
6.類類型變量的初始化:每個類都定義了該類型的對象可以怎樣初始化。類通過定義一個或多個構造函數來控制類對象的初始化
7.聲明和定義:
變量的定義用于為變量分配存儲空間,還可以為變量指定初始值。在一個程序中,變量有且僅有一個定義。
聲明用于向程序表明變量的類型和名字。表明在程序中其他地方定義的變量、函數或類型的存在性。有些聲明也是定義。只有定義才為變量分配存儲空間。
定義也是聲明:當定義變量時我們聲明了它的類型和名字。可以通過使用extern關鍵字聲明變量名而不定義它。不定義變量的聲明包括對象名、對象類型和對象類型前的關鍵字extern:
extern int i; // declares but does not define i int i; // declares and defines iextern 聲明不是定義,也不分配存儲空間。事實上,它只是說明變量定義在程序的其他地方。程序中變量可以聲明多次,但只能定義一次。
如果聲明有初始化,則可以看作是定義:
extern double pi = 3.1416只有當 extern 聲明位于函數外部時,才可以含有初始化式。
非 const 變量默認為 extern。
8.名字的作用域:用來區分名字的不同意義的上下文稱為作用域. C++ 語言中,大多數作用域是用花括號來界定的。一般來說,名字從其聲明點開始直到其聲明所在的作用域結束處都是可見的。
#include int main(){ int sum = 0; // sum values from 1 up to 10 inclusive for (int val = 1; val <= 10; ++val) sum += val; // equivalent to sum = sum + val std::cout << "Sum of 1 to 10 inclusive is " << sum << std::endl;return 0;}定義在所有函數外部的名字具有全局作用域.?
變量 sum 有局部作用域
名字 val 更有意思,它定義在 for 語句的作用域中,只能在 for 語句中使用,而不能用在 main 函數的其他地方。它具有語句作用域。
9.一般來說,變量的定義或聲明可以放在程序中能擺放語句的任何位置。變量在使用前必須先聲明或定義。
通常把一個對象定義在它首次使用的地方是一個很好的辦法。
10.const 限定符:因為常量在定義后就不能被修改,所以定義時必須初始化
與其他變量不同,除非特別說明,在全局作用域聲明的 const 變量是定義該對象的文件的局部變量。此變量只存在于那個文件中,不能被其他文件訪問。
通過指定 const 變更為 extern,就可以在整個程序中訪問 const 對象:
// file_1.cc// defines and initializes a const that is accessible to other filesextern const int bufSize = fcn();// file_2.ccextern const int bufSize; // uses bufSize from file_1 // uses bufSize defined in file_1 for (int index = 0; index != bufSize; ++index) // ...11.引用是一種復合類型,通過在變量名前添加“&”符號來定義。復合類型是指用其他類型定義的類型。在引用的情況下,每一種引用類型都“關聯到”某一其他類型。
復合類型是指用其他類型定義的類型,
a.不能定義引用類型的引用,但可以定義任何其他類型的引用。引用必須用與該引用同類型的對象初始化.
b.因為引用只是它綁定的對象的另一名字,作用在引用上的所有操作事實上都是作用在該引用綁定的對象上.
c.當引用初始化后,只要該引用存在,它就保持綁定到初始化時指向的對象。不可能將引用綁定到另一個對象。
引用的基本知識
引用就是某一變量(目標)的一個別名,對引用的操作與對變量直接操作完全一樣。引用的聲明方法:類型標識符 &引用名=目標變量名; 說明:
(1)&在此不是求地址運算,而是起標識作用。
(2)類型標識符是指目標變量的類型。
(3)聲明引用時,必須同時對其進行初始化。
(4)引用聲明完畢后,相當于目標變量名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變量名的別名。
?? int a,&ra=a;a為目標原名稱,ra為目標引用名。給ra賦值:ra=1; 等價于 a=1;
(5)聲明一個引用,不是新定義了一個變量,它只表示該引用名是目標變量名的一個別名,它本身不是一種數據類型,因此引用本身不占存儲單元,系統也不給引用分配存儲單元。故:對引用求地址,就是對目標變量求地址。&ra與a相等。
(6)不能建立數組的引用。因為數組是一個由若干個元素所組成的集合,所以無法建立一個數組的別名。
例如: Point pt1(10,10);
Point &pt2=pt1; 定義了pt2為pt1的引用。通過這樣的定義,pt1和pt2表示同一對象。
需要特別強調的是引用并不產生對象的副本,僅僅是對象的同義詞。因此,當下面的語句執行后:
pt1.offset(12,12);
pt1和pt2都具有(12,12)的值。
引用必須在定義時馬上被初始化,因為它必須是某個東西的同義詞。你不能先定義一個引用后才
初始化它。例如下面語句是非法的:
Point &pt3;
pt3=pt1;
12.const 引用可以綁定到 const 對象、非 const 對象或右值的引用。const 引用不能改變與其相關聯的對象。const 引用可以初始化為不同類型的對象或者初始化為右值,如字面值常量:
int i = 42;// legal for const references only const int &r = 42; double dval = 3.14; const int &ri = dval;非 const 引用只能綁定到與該引用同類型的對象。
13.typedef 可以用來定義類型的同義詞:
typedef double wages; // wages is a synonym for double typedef int exam_score; // exam_score is a synonym for int typedef wages salary; // indirect synonym for doubletypedef 定義以關鍵字 typedef 開始,后面是數據類型和標識符。標識符或類型名并沒有引入新的類型,而只是現有數據類型的同義詞。typedef 名字可出現在程序中類型名可出現的任何位置。
?
14.enum:
a.枚舉的定義包括關鍵字 enum,其后是一個可選的枚舉類型名,和一個用花括號括起來、用逗號分開的枚舉成員列表。
b.可以為一個或多個枚舉成員提供初始值,用來初始化枚舉成員的值必須是一個常量表達式。常量表達式是編譯器在編譯時就能夠計算出結果的整型表達式。整型字面值常量是常量表達式
c.不能改變枚舉成員的值。枚舉成員本身就是一個常量表達式,所以也可用于需要常量表達式的任何地方。
?
15.類類型:類定義以關鍵字 class 開始,其后是該類的名字標識符。類體位于花括號里面。花括號后面必須要跟一個分號。
a.定義了類,也就定義了一種新的類型。類名就是該類型的名字。通過命名 Sales_item 類,表示 Sales_item 是一種新的類型,而且程序也可以定義該類型的變量。b.每一個類都定義了它自己的作用域.也就是說,數據和操作的名字在類的內部必須唯一,但可以重用定義在類外的名字。c.定義變量和定義數據成員存在非常重要的區別:一般不能把類成員的初始化作為其定義的一部分。當定義數據成員時,只能指定該數據成員的名字和類型。類不是在類定義里定義數據成員時初始化數據成員,而是通過稱為構造函數的特殊成員函數控制初始化。
d.用 class 和 struct 關鍵字定義類的唯一差別在于默認訪問級別:默認情況下,struct 的成員為 public,而 class 的成員為 private。
?
16.頭文件:頭文件一般包含類的定義、extern 變量的聲明和函數的聲明。使用或定義這些實體的文件要包含適當的頭文件。 a.頭文件的正確使用能夠帶來兩個好處:保證所有文件使用給定實體的同一聲明;當聲明需要修改時,只有頭文件需要更新。 b.設計頭文件還需要注意以下幾點:頭文件中的聲明在邏輯上應該是統一的。編譯頭文件需要一定的時間。如果頭文件太大,程序員可能不愿意承受包含該頭文件所帶來的編譯時代價。為了減少處理頭文件的編譯時間,有些 C++ 的實現支持預編譯頭文件。c.頭文件用于聲明而不是用于定義,因為頭文件包含在多個源文件中,所以不應該含有變量或函數的定義。對于頭文件不應該含有定義這一規則,有三個例外。頭文件可以定義類、值在編譯時就已知道的 const 對象和 inline 函數。這些實體可在多個源文件中定義,只要每個源文件中的定義是相同的。
d.一些 const 對象定義在頭文件中:
????? 1.當該 const 變量是用常量表達式初始化時,可以保證所有的變量都有相同的值。但是在實踐中,大部分的編譯器在編譯時都會用相應的常量表達式替換這些 const 變量的任何使用。所以,在實踐中不會有任何存儲空間用于存儲用常量表達式初始化的 const 變量。
????? 2.如果 const 變量不是用常量表達式初始化,那么它就不應該在頭文件中定義。相反,和其他的變量一樣,該 const 變量應該在一個源文件中定義并初始化。應在頭文件中為它添加 extern 聲明,以使其能被多個文件共享。
const double pi = 3.1416;//可以定義在頭文件中const double sq2 = sqrt(2.0);//不可以定義在頭文件中17.預處理器:#include 設施是C++ 預處理器的一部分。預處理器處理程序的源代碼,在編譯器之前運行。
a.設計頭文件時,應使其可以多次包含在同一源文件中,這一點很重要。我們必須保證多次包含同一頭文件不會引起該頭文件定義的類和對象被多次定義。使得頭文件安全的通用做法,是使用預處理器定義頭文件保護符。頭文件保護符用于避免在已經見到頭文件的情況下重新處理該頭文件的內容
b.頭文件應該含有保護符(為防止頭文件被同一源文件多次包含而定義的預處理器變量。),即使這些頭文件不會被其他頭文件包含。編寫頭文件保護符并不困難,而且如果頭文件被包含多次,它可以避免難以理解的編譯錯誤。
?
#ifndef SALESITEM_H #define SALESITEM_H // Definition of Sales_itemclass and related functions goes here #endif /*1.測試 SALESITEM_H 預處理器變量是否未定義。如果 SALESITEM_H 未定義,那么 #ifndef 測試成功,跟在 #ifndef 后面的所有行都被執行,直到發現 #endif。相反,如果 SALESITEM_H 已定義,那么 #ifndef 指示測試為假,該指示和 #endif 指示間的代碼都被忽略。2.為了保證頭文件在給定的源文件中只處理過一次,我們首先檢測 #ifndef。第一次處理頭文件時,測試會成功,因為 SALESITEM_H 還未定義。下一條語句定義了 SALESITEM_H。那樣的話,如果我們編譯的文件恰好又一次包含了該頭文件。#ifndef 指示會發現 SALESITEM_H 已經定義,并且忽略該頭文件的剩余部分。*/?
?
轉載于:https://www.cnblogs.com/ForFreeDom/archive/2012/03/18/2404392.html
總結
- 上一篇: 成为中国最好的Magento开发公司
- 下一篇: WinForm 中 comboBox控件