c++从入门到进阶--引用与常量
一·常量表達(dá)式和constexpr與const
常量表達(dá)式概念:值不會(huì)改變并且在編譯過程中就能計(jì)算出結(jié)果的表達(dá)式。
ps:constexpr int a=20; constexpr int b=20+a;constexpr必須用常量表達(dá)式初始化,也就是說必須在編譯過程就能計(jì)算出結(jié)果(若要用函數(shù)作為constexpr的初始值那么該函數(shù)應(yīng)該是constexpr類型的函數(shù))。
constexpr函數(shù)必須滿足下述限制:
函數(shù)返回值不能是void類型 函數(shù)體不能聲明變量或定義新的類型
函數(shù)體只能包含聲明、null語句或者一條return語句
在形參實(shí)參結(jié)合后,return語句中的表達(dá)式為常量表達(dá)式
const 不要求在編譯過程中就能計(jì)算出結(jié)果 (強(qiáng)調(diào)運(yùn)行時(shí)不可改變) 大多數(shù)情況下并沒有區(qū)別。
const限定指針和引用。
指向const對(duì)象的指針 const type 指針
const int a=1; //const地址無法賦給非const指針?biāo)詰?yīng)該定義一個(gè)指向const的指針 const int * b=&a; //指向常量的指針,而非常指針。 const int c=2; b=&c; //指向?qū)ο罂梢愿淖?#xff0c;指向?qū)ο髢?nèi)容不能改變。 int d=10; b=&d; //也可以將一個(gè)非const地址賦給 指向const的指針 但是不能通過該指針改變?cè)撟兞康膬?nèi)容。 *b=15;//錯(cuò)誤指向非const對(duì)象地const指針(常指針 ) type const 指針
int num =10;int * const poi =#// type const 指針 指針的值初始化后不能改變指向固定的單元(只能指一次)*poi=99;//const限定的是poi的值;可以對(duì)指向內(nèi)容修改,但不可以對(duì)指針指向?qū)ο笮薷摹nt member=10;poi=&member;//錯(cuò)誤指向const對(duì)象的const指針
/*const type const 指針(第一個(gè)const限定int表示指針指向的單元是常量, 第二個(gè)const限定‘指針’表示指針的值也是常量,因此該指針?biāo)诘膬?nèi)存值不允許改變它所指向內(nèi)存的值也不能改變)*/ int demo=10; const int *const pi=&demo;對(duì)象及內(nèi)容都不能改變const限定引用,與const指針相似
const int a=1; int 7b=a;// const type &引用名(不能用非const引用指向const對(duì)象) const int& b=a;//right b=10;//錯(cuò)誤,const引用不能用來修改他所綁定的對(duì)象。 a=10;//const引用僅對(duì)自己可參與的操作進(jìn)行了限定對(duì)所指向的對(duì)象本身是不是常量未作限定。因?yàn)橹赶虻膶?duì)象也可能不是const,所以允許通過其他途徑改變它的值。 const int &c=a*10;//可以用任意表達(dá)式初始化const引用,只要表達(dá)式的結(jié)果能轉(zhuǎn)換成引用的類型即可。二.auto和decltype
由auto聲明變量的類型由編譯器去自動(dòng)分析表達(dá)式的類型,推斷出變量的實(shí)際類型(很好用)
auto x=5 auto x=1,c=3.14;//一個(gè)int 一個(gè)double錯(cuò)!當(dāng)auto后定義多個(gè)變量時(shí)類型要一致 auto poi=Set.begin()//很好用,省了set<type>::iteratordecltype 可以通過表達(dá)式推斷出定義的變量的類型但是不用該表達(dá)式初始化。
int i = 4; decltype(i) a; //推導(dǎo)結(jié)果為int。a的類型為int。三.new和delete
new在對(duì)上動(dòng)態(tài)分配空間創(chuàng)建對(duì)象并返回對(duì)象的地址,一般將返回的地址保存在指針變量中,以便間接訪問對(duì)上的對(duì)象
int *pi=new int; int *poi=new int(1000);/* new表達(dá)式的形式 1.分配單個(gè)對(duì)象new 類型,new 類型(初始值) 2.分配多個(gè)連續(xù)存儲(chǔ)的對(duì)象 new 類型[數(shù)組大小] 3.定位new(將對(duì)象創(chuàng)建在已經(jīng)分配好的內(nèi)存中) new (指針) 類型;*/堆上的空間在使用后必須釋放否則會(huì)造成內(nèi)存泄漏,
delete pi; delete poi[];/*new分配的空間用delete運(yùn)算符釋放。 1釋放 new分配的單個(gè)對(duì)象 delete 指針; 2釋放new分配的數(shù)組形式 delet[] 指針; 3 定位new沒有對(duì)應(yīng)的形式;*/執(zhí)行delete運(yùn)算后指針指向的空間被釋放歸還給自由空間不能再使用指針?biāo)赶虻膬?nèi)容,但是指針自己的儲(chǔ)存空間還是存在的。該指針被稱為空懸指針指向不確定的單元如果在繼續(xù)使用該指針間接使用這個(gè)單元就是非法的對(duì)自由空間造成損害進(jìn)而引起不可預(yù)料的錯(cuò)誤。
四.引用
左值與右值
| 賦值表達(dá)式 | 出現(xiàn)在賦值號(hào)左邊 | 在賦值號(hào)右邊的 |
| 地址與名字 | 可以取地址的有名字 | 不能取地址的沒有名字 |
| 生成的表達(dá)式 | 返回左值引用的函數(shù) 賦值 下標(biāo) 解引用和前綴自增自減運(yùn)算符 | 返回非引用類型的函數(shù) 連同算術(shù)、關(guān)系、位運(yùn)算、后綴自增自減運(yùn)算符、字面值常量、要求轉(zhuǎn)換的表達(dá)式。 |
左值引用 (定義 類型 &引用名=目標(biāo)變量名)
int a=100; int &b=a;/*&是標(biāo)識(shí)符(引用必須被初始化并且初始化完成之后引用將會(huì)和初始值對(duì)象一直綁定在一起)。*/ b=10;//又稱別名,它可以作為對(duì)象的另一個(gè)名字,通過引用可以間接的操縱對(duì)象,對(duì)引用的操作和對(duì)對(duì)象的直接操作一樣。 int *poi=&a; int *pi=&b;//此時(shí)a==b /* 聲明一個(gè)引用,不是新定義了一個(gè)變量,它只表示該引用名是目標(biāo)變量名的一個(gè)別名,它本身不是一種數(shù)據(jù)類型,因此引用本身不占存儲(chǔ)單元,系統(tǒng)也不給引用分配存儲(chǔ)單元。故:對(duì)引用求地址,就是對(duì)目標(biāo)變量求地址。引用本身不是對(duì)象所以不能定義引用的引用。*/右值引用(必須要綁定到右值的引用)定義 類型 &&右值引用變量=右值表達(dá)式;
int &&a=10;//正確 int &&b=10*5;//正確10*5是右值 int &&c=a;//a的類型是int是左值調(diào)用標(biāo)準(zhǔn)庫中定義的函數(shù)std::move() move()函數(shù)返回給定對(duì)象的右值引用, 可以顯式的將一個(gè)左值轉(zhuǎn)換為對(duì)應(yīng)的右值引用類型。
int &&c=move(a);//但是過程是銷毀a,a的右值由c接管。此后不能使用a,但可以給它賦新右值。五.文件的輸入輸出
文件的讀寫
如果想以輸入方式打開,就用ifstream來定義;
如果想以輸出方式打開,就用ofstream來定義;
如果想以輸入/輸出方式來打開,就用fstream來定義
區(qū)別
ifstream ifile; ofstream ofile; ofile<<"I Love You";//向文件寫入字符串"I Love You" int i; ifile>>i;//從文件輸入一個(gè)整數(shù)值。字符串流stringstream是 C++ 提供的一個(gè)字符串流(stream),和iostream、fstream有類似的操作方式
istringstream 從string中讀取數(shù)據(jù) 定義 istringstream is(strs);
ostringstream 向string對(duì)象寫入格式化的內(nèi)容。
stringstream 即可以讀取也可以寫入。
與容器一樣流不會(huì)降低自己空間,即使用了ss.clear()😭 清空操作如下 😦
ss.clear();//清空流 ss.str("");六.range -for
for(int ele :{2,3,44,5,6,77}) {cout<<ele<<endl; } int arr []={1,2,3,4} for(int ele :arr) {cout<<ele<<endl; } vector<int > demo={1,2,3,4};//結(jié)合auto關(guān)鍵字可以方便地遍歷STL容器 for(auto ele:demo) {cout<<ele<<endl<<; }for(auto& ele:demo) 如果需要修改其中元素可以引用; {ele+=2; }切記!!!!! 不能在遍歷容器時(shí),改變?nèi)萜鞯腟ize,即增刪元素。
七.函數(shù)
實(shí)參一定是確定值 不需要類型!!!
1.函數(shù)的參數(shù)
1)形參和實(shí)參
形參:在定義函數(shù)的時(shí)候,函數(shù)名后面小括號(hào)中的參數(shù) , 格式: 數(shù)據(jù)類型 變量 如:int x;
形參的作用域:只能在本函數(shù)中使用
實(shí)參:調(diào)用函數(shù)的時(shí)候傳遞的參數(shù)
2)參數(shù)的傳遞的過程
實(shí)參的值拷貝一份放到函數(shù)形參中
3)函數(shù)傳參有三種傳參方式:傳值、傳址、傳引用
①按值傳遞
ⅰ形參和實(shí)參各占一個(gè)獨(dú)立的存儲(chǔ)空間。
ⅱ形參的存儲(chǔ)空間是函數(shù)被調(diào)用時(shí)才分配的,調(diào)用開始,系統(tǒng)為形參開辟一個(gè)臨時(shí)的存儲(chǔ)區(qū),然后將各實(shí)參傳遞給形參,這是形參就得到了實(shí)參的值。
②地址傳遞
地址傳遞與值傳遞的不同在于,它把實(shí)參的存儲(chǔ)地址傳送給形參,使得形參指針和實(shí)參指針指向同一塊地址。因此,被調(diào)用函數(shù)中對(duì)形參指針?biāo)赶虻牡刂分袃?nèi)容的任何改變都會(huì)影響到實(shí)參。
③引用傳遞
引用傳遞是以引用為參數(shù),則既可以使得對(duì)形參的任何操作都能改變相應(yīng)數(shù)據(jù),又使函數(shù)調(diào)用方便。引用傳遞是在形參調(diào)用前加入引用運(yùn)算符“&”。引用為實(shí)參的別名,和實(shí)參是同一個(gè)變量,則他們的值也相同,該引用改變則它的實(shí)參也改變。
2.函數(shù)的返回值
概念:執(zhí)行函數(shù)體中的程序段,最后獲取的值并返回給主調(diào)函數(shù),函數(shù)的返回值只能通過return 關(guān)鍵字進(jìn)行返回
格式:return 表達(dá)式;/ return (表達(dá)式);
返回值類型要與返回值相同。
是否要定義形參看是否有未知內(nèi)容參與運(yùn)算,調(diào)用時(shí)實(shí)參必須對(duì)應(yīng).參數(shù)傳遞的是值。
函數(shù)中可以有多個(gè)return ,但是只有一個(gè)起作用,因?yàn)楹瘮?shù)會(huì)結(jié)束后會(huì)帶回一個(gè)值。
函數(shù)調(diào)用和返回
函數(shù)調(diào)用會(huì)使程序的控制權(quán)傳遞給被調(diào)函數(shù)而當(dāng)前活動(dòng)會(huì)被掛起。
當(dāng)前函數(shù)執(zhí)行完成后主函數(shù)從調(diào)用語句之后的語句恢復(fù)執(zhí)行。
函數(shù)在執(zhí)行完函數(shù)體的最后一條語句或或遇到return語句時(shí)返回。
返回類型和return語句
return 語句形式
非void函數(shù)必須返回一個(gè)與聲明類型匹配的值否則會(huì)引起編譯錯(cuò)誤。
返回值 默認(rèn)情況下,函數(shù)的返回值是按值傳遞的,得到控制權(quán)的函數(shù)將接受return語句中指定的表達(dá)式值得副本。
返回引用(我覺得特別重要)
函數(shù)聲明為返回引用,則不需要對(duì)return語句中的表達(dá)式進(jìn)行復(fù)制,而是返回對(duì)象本身。
函數(shù)返回引用僅是它所指向?qū)ο蟮囊粋€(gè)別名。
注:對(duì)引用返回值的修改會(huì)改變實(shí)際返回的對(duì)象,為了避免這種情況,可以將返回值聲明稱const。
不能返回自動(dòng)局部對(duì)象的指針或引用:函數(shù)執(zhí)行結(jié)束后,函數(shù)占用的棧存儲(chǔ)空間被釋放,原本位于這段存儲(chǔ)空間中的局部對(duì)象和臨時(shí)變量都被釋放,返回的局部對(duì)象引用或指針指向不再有效的內(nèi)存區(qū)域
重載函數(shù)
如果同一個(gè)作用域內(nèi)的幾個(gè)函數(shù)名字相同但形參列表不同,則他們是重載函數(shù)
形參列表不同的概念:
1.形參數(shù)量不同
2.形參類型不同
3.常指針與指針不同,常引用與引用不同。
調(diào)用函數(shù)時(shí)如果存在多個(gè)重載函數(shù),編譯器將根據(jù)函數(shù)調(diào)用中指定的實(shí)參進(jìn)行選擇。
存儲(chǔ)類別 static靜態(tài)存儲(chǔ)
static對(duì)象在控制流程第一次到達(dá)其定義點(diǎn)時(shí)被初始化,如果沒有提供初始值就被自動(dòng)初始化為0;
在函數(shù)的后續(xù)調(diào)用中,初始化語句被跳過
靜態(tài)對(duì)象的值在函數(shù)被多次調(diào)用之間保持有效,生存期會(huì)延續(xù)到整個(gè)程序結(jié)束但他的作用于仍然是局部的,因此需要在同一函數(shù)的兩次調(diào)用之間保留某些數(shù)據(jù)時(shí)可以使用局部static對(duì)象。
八.指針
附博客 https://mp.csdn.net/mdeditor/86935527#
https://mp.csdn.net/mdeditor/87398537#
總結(jié)
以上是生活随笔為你收集整理的c++从入门到进阶--引用与常量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 炒股软件哪个好(股票软件哪个好用)
- 下一篇: C++ #define详解