目錄
第一章、c++快速入門
重點:類的簡介
第二章
1、基本內置類型
2、字面值常量
1、整型字面值規則
2、浮點字面值規則
3、布爾字面值
4、字符字面值
5、非打印字符的轉義序列
?編輯
6、字符串字面值
3、變量
1、變量標識符
?2、定義和初始化對象
3、變量初始化規則
4、聲明和定義
5、名字的作用域
4、const限定符
5、引用
6、typedef 名字
7、枚舉
8、類類型
9、編寫自己的頭文件
第一章、c++快速入門
1、注釋對不能嵌套!!!若想注釋掉某行代碼用單行注釋!!
2、定義在for循環中的變量在退出for循環后不能再訪問。如下var
int m;
for(int var=0;var<10;var++)
{m+=var;
}
printf("%d\n",m); //m可以訪問,var不可訪問
3、windows系統下通過鍵入Ctrl+z來輸入文件結束符。例如下:
int var,sum;
while(std::cin>>var)
{sum++;
}
輸入Ctrl+z時程序會終止循環。
重點:類的簡介
1、類可以是系統自帶的,比如iostream,也可以自定義。引用方式不同,如下
#include <iostream>
#include "Sales_item" //自定義類用雙引號
2、每個類定義一種類型,類里面還有對象和成員函數(也叫類方法)等。如下:
int main()
{Sales_item item1,item2;std::cin>>item1>>item2;if(item1.same_isbn(item2)) //以.的方式引用成員函數{std::cout<<item1+item2<<std::endl;//兩個對象可以相加,具體要看Sales_item頭文件里讓相加做什么}return 0;
}
第二章
1、基本內置類型
1、wchar_t類型用于擴展字符集,如漢字和日語等。
2、存儲方式:通常將8位的塊作為一個字節。32位或4個字節作為一個字(word)。
3、帶符號類型可以表示正數、負數、0。? 無符號類型只能表示正數和0。
4、一個使用一位符號位的表示方式為8位的signed整型取值是從-128到127。
5、c++中,把負值賦給unsigned對象是完全合法的,其結果是該負數對該類型的取值個數求模后的值。(如-1賦給8位unsigned char結果是255,即-1對256求模)
6、long類型運行時代價遠遠高于用int類型進行同樣計算的代價。
7、float類型中隱式的精度損失不能忽視,但double計算的代價相對于float可以忽略。
2、字面值常量
只有內置類型存在字面值,沒有類類型的字面值。因此也沒有任何標準庫類型的字面值。
1、整型字面值規則
1、以0開頭的字面值整數常量表示八進制,以0x或0X開頭的表示十六進制。
2、在數值后面加L指定常量為long類型。在數值后面加U或u定義unsigned類型。同時加L和U得到unsigned long類型的字面值常量(注意后綴不能有空格!!)。沒有short型的字面值常量。
128u //unsigned
1L //long
1024UL //unsigned long
8LU //unsigned long (U和L誰在前都可)
2、浮點字面值規則
默認的浮點字面值常量為double類型。在數值后加上F或f表示單精度。加上L表示擴展精度。
3.14159F //每組表示的數值相同
3.14159E0f.001f
1E-3F12.345L
1.2345E1L0.
0e0
3、布爾字面值
true和false
bool test=false;
4、字符字面值
在字符字面值前面加L能得到wchar_t類型的寬字符字面值。
'a'
L'a'
5、非打印字符的轉義序列
可以用八進制和十六進制轉義字符來定義任何字符
6、字符串字面值
1、“A”是包含字母A和空字符‘\0’兩個字符的字符串。
2、寬字符字面值是一串常量寬字符,以一個寬空字符結束。
L"a wide string literal"
3、字符串字面值的連接
法(1)、兩個相鄰的僅由空格、制表符或換行符分開的字符串字面值(或寬字符串字面值),可連接成一個新字符串字面值。這樣可以多行書寫長字符串字面值。
std::cout<<"apple banana " //末尾留空格/*后繼行行首隨便空格或者制表符,不算入字符串內部*/ "pear grape ""orange strawberry"<<std::endl;輸出:apple banana pear grape orange strawberry
法(2)、 多行字面值也可以處理長字符串。
在一行的末尾加一個反斜線符號可將此行和下一行當做同一行處理。
std::cou\
t<<"hello"<<st\
d::endl;相當于std::cout<<"hello"<<std::endl;
std::cout<<"apple banana \
pear grape \
orange strawberry"<<std::endl;輸出:apple banana pear grape orange strawberry
注意反斜線符號必須是該行的尾字符,不允許其后面有注釋或空格!!!
采用\處理多行字面值時,后繼行行首的任何空格和制表符都是字符串字面值的一部分。因此,長字符串字面值的后繼行不能有縮進(除非上一行行尾還沒縮進完)。
3、變量
對象就是內存中具有類型的區域。
1、變量標識符
關鍵字不能用作變量的標識符。如下:
?下面這張僅做了解。
注:以下標識符是可以的
Float
_
?2、定義和初始化對象
對象初始化可以用復制初始化(=)或直接初始化(括號)
int var=1024;
int var(1024);
直接初始化的語法更靈活且效率更高。
注:初始化不是賦值!!初始化指創建變量并給它賦初始值,而賦值則是擦除對象的當前值并用新值代替。
對內置類型來說,復制初始化和直接初始化幾乎沒有差別。
對類類型的對象來說,有些初始化僅能用直接初始化完成。定義如何進行初始化的成員函數稱為構造函數。
#include <string>
std::string titleA="c++ primer,4th ed.";
std::string titleB("c++ primer,4th ed.");std::string all_nines(10,'9');
//all_nines="9999999999"
//這種初始化方式也是直接初始化,有多個初始化式(初始化值可變)時不能用復制初始化。
可以用同一個定義中前面已定義的值初始化后面的變量。
double salary=9999.99,wage(salary+0.01);
3、變量初始化規則
1、內置類型變量的初始化
在函數體外定義的變量都初始化成0,在函數體內定義的內置類型變量不進行自動初始化。
2、類類型變量的初始化
如果類具有默認構造函數,那么就可以在定義該類的變量時不用顯示地初始化變量。
#include <iostream>
#include <string>
int main()
{std::string empty; //定義了一個名為empty的字符串變量,并且不進行初始化std::cout<<empty<<std::endl; //輸出" "(空字符),string類型默認初始化為空
}
有些類類型沒有默認構造函數,那么每個定義都必須提供顯示的初始化式,沒有初始值根本不可能定義這種類型的變量。
4、聲明和定義
1、定義:用于為變量分配存儲空間,指定初始值。
2、聲明:用于向程序表明變量的類型和名字。不分配存儲空間!!
定義也是聲明!!
3、可以通過extern關鍵字聲明變量而不定義它。
extern int i; //聲明但不定義
int i; //定義
注:一個變量只能定義一次!!但可以聲明多次!!
4、當extern聲明位于函數外部時,才可以含有初始化式。如果聲明有初始化式,那么該聲明也是定義。
extern double pi=3.14159; //聲明的同時定義
5、任何在多個文件中使用的變量都需要有與定義分離的聲明。
5、名字的作用域
1、全局作用域:定義在所有函數外部的名字
2、局部作用域:函數內的名字
3、語句作用域:定義在如for語句內
int add=0; //全局作用域
int main()
{int sum=0; //局部作用域for(int i=0;i<10;i++) //語句作用域{sum++;}
}
作用范圍:全局>局部>語句
若小作用域中某變量的名字和大作用域中某變量名字相同,則當運行到小作用域時,會屏蔽大作用域中對該變量的賦值或操作。
最好在使用變量時定義它,不要全都定義在開頭。
4、const限定符
常量在定義之后不能被修改,所以定義時必須初始化。
在全局作用域聲明的const變量是定義該對象的文件的局部變量。此變量只存在于那個文件中,不能被其他文件訪問。
通過指定const變量為extern,就可以在整個程序中訪問const對象。
//file_1.cpp
extern const int buf=fcn(); //文件1中定義//file_2.cpp
extern const int buf; //文件2中聲明并使用
for(int index=0;index!=buf;++index)
{//……
}
非const變量默認為extern。要使const變量能夠在其他文件中訪問,必須顯示地指定它為extern。
int cnt=0;
const int sz=cnt; //合法
5、引用
引用是對象的另一個名字。主要作為函數的形參。
引用必須用與該引用同類型的對象初始化。
int ival=1024;
int &refval=ival; //合法
int &refval2; //不合法,引用必須初始化
int &refval3=10; //不合法,引用的右值必須是對象
作用在引用上的所有操作事實上都作用在該引用綁定的對象上。
當引用初始化后,只要該引用存在,它就保持綁定到初始化時指向的對象。不可能將引用綁定到另一個對象。
const引用:指向const對象的引用
const int ival=1024;
const int &refval=ival;
int &ref2=ival; //不合法,不是const引用
非const引用只能綁定到與該引用同類型的對象。
const引用可以綁定到不同但相關的類型的對象或綁定到右值。
double dval=3.14;
const int &ri=dval;
//編譯器會轉化為以下代碼
int temp=dval;
const int &ri=temp;
6、typedef 名字
typedef double wages;
typedef wages salary;
typedef int exam_score;
7、枚舉
1、定義和默認賦值
enum Forms {shape=1,sphere,cylinder,polygon}; //默認逐個+1
//sphere=2, cylinder=3, polygon=4
enum Points {point2d = 2, point2w, point3d = 3, point3w };//在前一個基礎上+1
//point2w=3, point3w=4
?2、枚舉類型的對象的初始化或賦值,只能通過其枚舉成員或同一枚舉類型的其他對象來進行。
Points pt3d = point3d; //√,point3d是Points的枚舉成員
Points pt2w = 3; //×
pt2w = polygon; //×
pt2w = pt3d; //√,pt3d和pt2w都是同一個枚舉類型的枚舉成員
8、類類型
1、從操作接口設計類。每個類都定義了一個接口和一個實現。
?定義類時,通常先定義該類的接口,即該類所提供的操作。通過這些操作,可以決定該類完成? ? ?其功能所需要的數據和函數。
2、一般不能把類成員的初始化作為其定義的一部分。定義數據成員時,只能指定該數據成員的名字和類型。
3、c++中定義類類型除了關鍵字class以外,還支持另一個關鍵字struct(從C語言繼承過來的)
用class和struct關鍵字定義類的唯一差別在于默認訪問級別。默認情況下,struct的成員為public,而class的成員為private
9、編寫自己的頭文件
為了允許把程序分成獨立的邏輯塊,c++支持分別編譯
1、頭文件一般包括類的定義、extern變量的聲明和函數的聲明。
2、正確使用頭文件的好處:(1)保證所有文件使用給定實體的同一聲明
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2)當聲明需要修改時,只有頭文件需要更新
3、頭文件用于聲明而不是定義
? ? ? 定義只可以出現一次,聲明可以出現多次
extern int ival = 10; //雖然有 extern,但有初始化式,是定義
double fic; //雖然沒有初始化式,但也沒有extern,所以也是定義
同一個程序中有兩個以上文件含有上述任意一個定義都會導致多重定義鏈接錯誤。
?又因為頭文件包含在多個源文件中,所以頭文件不應該含有變量或函數的定義。
對于上述規定,有三個例外。頭文件可以定義類、值在編譯時就知道的const對象和inline函數
(const變量和它的初始化式必須是每個文件都可見的。而要使初始化式可見,一般都把這樣的const變量定義在頭文件中)
但如果const變量不是用常量表達式初始化,那么它就不應該在頭文件中定義。應該在一個源文件中定義并初始化,并在頭文件里為它加上extern聲明。
4、預處理器
(1)頭文件中有可能會引用其他頭文件,所以源文件對于某個頭文件可能會直接引用一次又間接引用一次。
因此設計頭文件時應使其可以多次包含在同一源文件中。保證多次包含同一頭文件不會引起該頭文件定義的類和對象被多次定義。
頭文件保護符可以避免在已經見到頭文件的情況下重新處理該頭文件的內容。
(2)避免多重包含:
為避免名字沖突,預處理器變量通常用大寫字母表示
預處理器有兩種狀態:已定義或未定義。
#define 表示定義預處理器變量? ?#ifndef 表示檢測指定的預處理器變量是否未定義
如果預處理器變量未定義,那么跟在其后的所有指示都被處理,直到出現#endif
例:
#ifndef SALES
#define SALES
//Defination of class
#endif
若SALES預處理器變量未定義,#ifndef測試成功,跟在#ifndef后面的所有行都被執行,直到#endif
若SALES預處理器變量已定義,#ifndef測試為假,#ifndef到#endif的部分都會被忽略
(3)自定義頭文件
#include <xxx> 標準頭文件? ? ? ?#include “xxx” 自定義頭文件??