企業(yè)手機(jī)端網(wǎng)站設(shè)計模板有域名了怎么建立網(wǎng)站
概要
C++入門主要講的是C語言的一些不足,C++作為補(bǔ)充,來補(bǔ)充C的不足之處
C++的關(guān)鍵字有63個,C語言有32個(作為了解,不需要專門記)
?
變量的命名規(guī)則:
- 變量名必須以字母或下劃線開頭。
- 變量名只能包含字母、數(shù)字和下劃線。不允許使用其他特殊字符。
- 不能與關(guān)鍵字重名
C語言中有命名沖突的問題(與庫函數(shù),或者工程里的其他變量/函數(shù)名發(fā)生沖突),因此就引出了命名空間的概念。
ps:前面的文章有專門講過命名空間,這里就不再重復(fù)介紹辣,可以去翻翻之前的文章
輸入輸出
istream? ?輸入流
ostream? 輸出流
而C++中常用到的cin和cout就分別是istream和ostream的對象
cin? ? >>? 流提取運算符? 輸入
cout? <<? 流插入運算符? 輸出
cout 可以自動識別類型(但是是基于函數(shù)重載基礎(chǔ)上的,后面會說到函數(shù)重載)
類庫提供的頭文件中已經(jīng)對“<<”和“>>”進(jìn)行了重載,使之作為流插入運算符和流提取運算符,能用來輸出和輸入C++標(biāo)準(zhǔn)類型的數(shù)據(jù)。
本質(zhì)是在補(bǔ)充C語言的不足 對全局的變量,函數(shù),類型進(jìn)行封裝,防止引發(fā)沖突
也可以去庫函數(shù)中查詢相關(guān)資料
C++官網(wǎng):en.cppreference.com/w/
C++的輸入輸出比scanf/ printf要慢一點點 why?
因為:C++會同步C語言,會檢查C語言的錯誤,如果希望快一點,可以選擇關(guān)閉同步C語言或者使用scanf / printf
缺省參數(shù)(默認(rèn)參數(shù))
注意:
1)傳參是從左往右傳參, 缺省是從右向左缺省
2)缺省參數(shù)應(yīng)該在聲明的時候給缺省值,定義給缺省值沒有實際意義,這樣在傳參的時候會轉(zhuǎn)化到對應(yīng)參數(shù)個數(shù)
3)必須是常量或者全局變量
1】全缺省:會用缺省值來初始化
如果給了參數(shù)則用參數(shù)值來初始化?
2】半缺省:從右向左缺省
函數(shù)重載
同一作用域 形參(參數(shù)個數(shù) 類型 類型的順序)不同 只有返回值不同是不行的
無參調(diào)用存在歧義 調(diào)用0個的時候存在歧義
為什么C++支持函數(shù)重載? 答:與函數(shù)名修飾規(guī)則有關(guān) 以及 編譯鏈接過程有關(guān)
三個文件:Stack.h Stack.c test.c
預(yù)處理 頭文件展開 宏替換 去除注釋 條件編譯 .i? ? 最后生成Stack.i test.i
編譯 語法檢查 生成對應(yīng)匯編代碼 .s? ? ? ? ? ? ? ? ? ? ? 最后生成 Stack.s test.s
匯編? ?xor(邏輯異或) ?cpu是不認(rèn)識匯編代碼的,只識別二進(jìn)制。需要把匯編代碼轉(zhuǎn)換成二進(jìn)制機(jī)器碼 .o目標(biāo)文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 最后生成 Stack.o test.o
鏈接 可執(zhí)行程序 .exe /a.out(不指定) 此過程中 才會去看會不會重命名(找到定義 兌現(xiàn)承諾) 頭文件中聲明代表承諾 鏈接的過程就是一個兌現(xiàn)承諾的過程
error:無法解析外部符號 鏈接錯誤
一般都是缺少定義(有聲明無定義) ,聲明和定義不能同時賦值(缺省值),只能在聲明中給缺省值,相當(dāng)于將缺省參數(shù)補(bǔ)全了
因此C++支持函數(shù)重載而C語言不支持的原因在于:
1、C語言同名編譯階段就會報錯 因為同名函數(shù)編譯器不知道找哪一個
2、C++ 編譯鏈接 g++將函數(shù)名和參數(shù)的數(shù)據(jù)類型縮寫寫入
windows下名稱修飾規(guī)則:
所有函數(shù)都要鏈接嗎?
如果在當(dāng)前文件就有定義的話 編譯階段直接(兌現(xiàn)承諾),不需要進(jìn)行鏈接操作,
因為編譯的時候給了定義,相當(dāng)于直接兌現(xiàn)承諾,就不需要進(jìn)行鏈接了。
引用
給已存變量取別名,與被引用的變量公用一塊命名空間
給引用變量賦值相當(dāng)于給被引用變量賦值
引用的價值?
一個變量可以有多個引用,但是引用一旦有一個實體就不能引用其他實體了
引用在定義的時候必須初始化
就是取別名,認(rèn)為沒有開辟新的空間
注意:
1.定義時就必須初始化
2.一個變量可以有多個引用
3.但是引用一旦對應(yīng)一個實體,就不能改變指向了
用引用的好處在于:
1、做參數(shù)
a、做輸出型參數(shù)
輸出型參數(shù)是指 形參改變會影響實參 就像swap函數(shù)用引用類型做形參,會改變實參
b、減少拷貝,提高效率
2、做返回值
a、減少拷貝,提高效率
做返回值的時候,因為出作用域變量會銷毀,所以會建立一個臨時變量;但是當(dāng)變量不銷毀(在靜態(tài)區(qū))的時候,也會建立臨時變量(會不會生成臨時變量,看的并不是變量出了函數(shù)會不會銷毀,而是返回值類型;如果是傳值返回,都會進(jìn)行拷貝生成臨時變量,如何不生成臨時變量?)可以用引用類型作為返回值不生成臨時變量,可以減少拷貝,提高運行效率
如果引用作為返回值,不需要拷貝,但是如果變量銷毀了,返回的結(jié)果就不能確定了
可能情況:a、函數(shù)調(diào)用結(jié)束,函數(shù)棧幀銷毀,未清理函數(shù)棧幀,結(jié)果是對的
? ? ? ? ? ? ? ? ? b、函數(shù)調(diào)用結(jié)束,函數(shù)棧幀銷毀,清理了函數(shù)棧幀,結(jié)果是錯的
所以說一定要保證出了函數(shù),變量不會銷毀(仍然存在),才可以返回引用
b、獲取返回值 修改返回值
可以用引用實現(xiàn)SLAt()函數(shù),同時實現(xiàn)SLGet()和SLModify()的功能,簡化代碼
引用權(quán)限
引用權(quán)限不可以放大,但是可以縮小/平移
const int a;
int& b=a;
//權(quán)限放大了,改變b a也會改變 但是a本身是不能被改變的
int a=10;
int& b=a;
//權(quán)限平移了,可以這么寫
int m=10;
int& n=m;
const int& p=m;
//權(quán)限縮小了。可以這么寫
//不能通過p來改變m,但是m本身是可以修改的
m++;//可以這么寫
n++;
//m和n變了之后p也變了
臨時變量創(chuàng)建場景
1】帶返回值的普通函數(shù),調(diào)用結(jié)束的時候會建立棧幀,建立臨時變量
2】在發(fā)生類型轉(zhuǎn)換的時候會創(chuàng)建臨時變量相同類型不會產(chǎn)生臨時變量)
double a=1.0;
int b=a;//a發(fā)生類型轉(zhuǎn)換,(截斷或提升的時候)先創(chuàng)建臨時變量if(a>b)//比較的類型不同,會發(fā)生類型提升(一般是小的向大的提升)
{ //先生成臨時變量swap(&a,&b);
}
引用與指針區(qū)別?
【1】從語法層面上看:
引用:不開空間,只是對變量取別名
指針:開空間,開辟空間存儲變量地址
【2】從底層匯編指令角度來看,引用是類似于指針方式實現(xiàn)的
auto用法
可以自動推導(dǎo)變量的類型
int a=1;
auto b=1+1.11;//可以根據(jù)右邊表達(dá)式,自動推導(dǎo)出b是double類型的cout<<typeid(b).name()<<endl;//輸出變量的數(shù)據(jù)類型
以后學(xué)到迭代器之后,代碼會很長,寫起來比較麻煩,所以用aoto較為簡便
注意:
1、auto不能做函數(shù)參數(shù)
void Test(auto a)//這種寫法是錯誤的
{,,,
}
2、不能直接聲明數(shù)組
void test()
{auto b[]={1,2,3,4};//這也是錯誤的
}
范圍for(語法糖)
//自動推導(dǎo)類型,依次取出數(shù)組中元素,賦值給e,自動迭代和判斷結(jié)束
int arr[10]={1,2,3,4,5,6,7,8,9,0};for(auto e:arr)
{cout<<e<<" ";
}
?