中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

廣州網(wǎng)站建設(shè)制作的公司個人怎么創(chuàng)建網(wǎng)站

廣州網(wǎng)站建設(shè)制作的公司,個人怎么創(chuàng)建網(wǎng)站,東莞常平網(wǎng)站建設(shè),訂閱號登陸平臺目錄 一、第一個C程序 二、C命名空間 1)什么是命名空間? 2)命名空間的使用 3) std庫與namespace展開 4)命名空間的嵌套使用 三、輸入輸出方式 四、缺省參數(shù) 1)什么是缺省參數(shù)? 2&#xff0…

目錄

一、第一個C++程序

二、C++命名空間

? ? ? ? 1)什么是命名空間?

? ? ? ? 2)命名空間的使用

? ? ? ? 3)?std庫與namespace展開

? ? ? ? 4)命名空間的嵌套使用?

三、輸入輸出方式

四、缺省參數(shù)

? ? ? ? 1)什么是缺省參數(shù)?

? ? ? ? 2)多個缺省值的缺省參數(shù)

五、函數(shù)重載

? ? ? ? 1)什么是函數(shù)重載?

? ? ? ? 2)為什么C++可以用函數(shù)重載??

六、C++引用與指針

? ? ? ? 1)什么是引用?

? ? ? ? 2)引用的規(guī)則特點:

? ? ? ? 1、引用必須初始化才能用

? ? ? ? 2、引用不能傳空指針

?編輯??

? ? ?3、一個變量或?qū)ο罂梢杂卸鄠€別名

?編輯

? ? ? ? 4、沒有所謂的二級引用

?編輯

? ? ? ? 5、引用不能改變指向

? ? ? ? 3)引用與指針的區(qū)別?

? ? ? ? 4)引用的使用

七、內(nèi)聯(lián)函數(shù)

? ? ? ? 1)什么是內(nèi)聯(lián)函數(shù)?

? ? ? ? 2)內(nèi)聯(lián)函數(shù)的特性


前言:

? ? ? ? 說到C++大家總會想到C語言,畢竟C++也就是C plus plus 么,沒有錯,C++在語法上是兼容C語言的。我們C++的祖師爺本賈尼·斯特勞斯特盧普在寫C程序的時候?qū)τ贑的一些語法規(guī)則感到不合適,于是祖師爺在C的基礎(chǔ)上開發(fā)了這樣一門語言。今天,我們就要開啟C++世界的大門了。

一、第一個C++程序

說到學(xué)習(xí)新的語言,那就不得不寫下人生中第一個C++程序了————你好,世界。

#include<iostream>using namespace std;int main()
{cout << "Hello World!\n";return 0;
}

????????是不是有當(dāng)年學(xué)C語言那味了,首先我們來分析一下是如何打印出來"Hello World!"。

????????我們在C語言中是用printf函數(shù)打印字符串的,在C++中是用cout(console out:控制臺輸出)來向控制臺輸出內(nèi)容的,在C語言中printf函數(shù)對不同類型的數(shù)據(jù)有對應(yīng)的輸出格式訪問控制符像%d,%s...才會打印出對應(yīng)類型的數(shù)據(jù),而在C++中的cout會自動識別變量類型,相比之下寫起來更加方便。

????????而在cout 后面跟著 '<<'叫做流插入限定符,表示在‘<<’右邊的數(shù)據(jù)流向左邊,cout << "hello world\n"; 就是將字符串信息流 流入到控制臺當(dāng)中打印。

????????那么知道了cout和流插入限定符就可以打印了嗎?很遺憾告訴你,還是不行,這就要涉及到using namespace std;這條語句了,那這是什么意思呢?那個頭文件也和C語言也不一樣啊,又是什么意思呢?讓我來一一為你介紹。


二、C++命名空間

? ? ? ? 1)什么是命名空間?

? ? ? ? 話說在祖師爺那個年代C語言是主流的高級語言,當(dāng)然祖師爺也不例外,寫項目也是用的C語言,其中祖師也在寫大型項目的時候總會遇到這樣一個問題:不同的程序員負責(zé)實現(xiàn)不同的模塊,但是在最后整合的時候總是會有兩個程序員用的變量或函數(shù)的名字相同。例如:

#include<iostream>
#include<stdio.h>//C語言中printf函數(shù)所需要的頭文件int printf = 1;int main()
{printf("%d", printf);return 0;
}

????????這種命名沖突要改是很麻煩的,祖師爺經(jīng)常被這個東西搞得頭疼,所以祖師爺在開發(fā)C++的時候直接規(guī)定了一種關(guān)鍵字來避免這種情況————namespace(命名空間)

? ? ? ??命名空間就是使用?namespace + 空間名?在namespace內(nèi)部會自動生成“一堵墻”, 這堵墻將namespace內(nèi)部內(nèi)容的命名與整個程序以及庫里的程序隔開,互不影響,就像這個世界上不止一個人叫張三,但是他們并不是同一個人。


? ? ? ? 2)命名空間的使用

? ? ? ? 那么我們知道了命名空間,但是該如何使用呢?我們把可能會沖突的變量或者函數(shù)放進命名空間內(nèi),在外部想要調(diào)用命名空間內(nèi)的內(nèi)容就需要? ‘::’? 叫做域作用限定符,是訪問namespace的專用符號,使用方法是:空間名::內(nèi)部變量/函數(shù)等,例如下面代碼:

#include<iostream>namespace byte{int printf = 1;}int main()
{std::cout << byte::printf;return 0; } 

?這樣就可以輸出printf這個變量了,就不會造成命名沖突的問題。


? ? ? ? 3)?std庫與namespace展開

? ? ? ? 有些時候我們在命名空間內(nèi)的函數(shù)或者變量在外部要多次調(diào)用的情況,每次調(diào)用之前都要加上空間名和域作用限定符,也是一件挺麻煩的事情,例如:

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<assert.h>namespace byte{typedef int STDataType;typedef struct Stack{STDataType* _a;int _top;		// 棧頂int _capacity;  // 容量 }Stack;// 初始化棧 Stack* StackInit(STDataType n){Stack *p = (Stack *)malloc(sizeof(Stack));//...p -> _a = (STDataType *)malloc(sizeof(STDataType) * n);//...p -> _top = -1;p -> _capacity = n;return p;}// 入棧 void StackPush(Stack* ps, STDataType data){assert(ps);//...ps -> _a[++ps -> _top] = data;return;}// 出棧 void StackPop(Stack* ps){assert(ps);if(ps -> _top > -1){ps -> _top -= 1;}return;}}void Test()
{byte::Stack *ps = byte::StackInit(5);byte::StackPush(ps, 1);byte::StackPush(ps, 1);byte::StackPush(ps, 1);byte::StackPush(ps, 1);byte::StackPop(ps);//... 
}int main()
{Test();return 0; } 

? ? ? ? 我們來模擬棧的實現(xiàn)(沒有全部寫出來),把棧的操作放在namespace里面在Test()中想要訪問棧每次都需要在造作前面加上這么一些東西,寫起來也很麻煩,所以祖師爺就規(guī)定了一種配套的關(guān)鍵字——using,使用方法是:using namespace 空間名;這樣就可以展開命名空間,也就是打開那堵墻,在使用時就不需要加上前面那一大坨了,但這個時候就不能保證命名沖突。

我們只需在命名空間下面加上這樣一條語句:using namespace byte;

這樣編譯的效果和上面代碼效果就是相同的了。

? ? ? ? namespace還有一種局部展開的方式,將命名空間內(nèi)的常用的變量或函數(shù)名局部展開防止命名空間內(nèi)的其他變量會與程序發(fā)生沖突,使用方法是:using 空間名::變量/函數(shù)名等 這樣也是比較常用的展開方式。例如:

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<assert.h>namespace byte{typedef int STDataType;typedef struct Stack{STDataType* _a;int _top;		// 棧頂int _capacity;  // 容量 }Stack;// 初始化棧 Stack* StackInit(STDataType n){Stack *p = (Stack *)malloc(sizeof(Stack));//...p -> _a = (STDataType *)malloc(sizeof(STDataType) * n);//...p -> _top = -1;p -> _capacity = n;return p;}// 入棧 void StackPush(Stack* ps, STDataType data){assert(ps);//...ps -> _a[++ps -> _top] = data;return;}// 出棧 void StackPop(Stack* ps){assert(ps);if(ps -> _top > -1){ps -> _top -= 1;}return;}}using byte::StackPush;
using byte::StackPop;void Test()
{byte::Stack *ps = byte::StackInit(5);StackPush(ps, 1);StackPush(ps, 1);StackPush(ps, 1);StackPush(ps, 1);StackPop(ps);//... 
}int main()
{Test();return 0; } 

? ? ? ? 這樣不經(jīng)常使用的和命名沖突的就可以不展開使用了,常用的變量或函數(shù)就可以來展開使用,避免了不必要的麻煩。

? ? ? ? 想必你也發(fā)現(xiàn)了,我們在最開始打印hello world的時候發(fā)現(xiàn)有這樣一條語句:using namespace std;實際上std也是一種命名空間,只不過std是C++庫的命名空間里面有很多用得到的函數(shù)模版等等,東西非常多,其中cout等也在std庫內(nèi),所以使用的時候要展開命名空間。

? ? ? ? 值得注意的是,我們前面也說了,如果展開命名空間就不能保證命名沖突的問題了,而且std庫內(nèi)的的內(nèi)容很多,保不準就會發(fā)生命名沖突,所以在寫大型項目時最好不要展開std,但是在日常的練習(xí)中還是展開的。


? ? ? ? 4)命名空間的嵌套使用?

? ? ? ? 我們在使用命名空間內(nèi)容比較多的時候,也保不準命名空間內(nèi)會出現(xiàn)命名沖突,所以C++就規(guī)定了可以允許命名空間嵌套命名空間,例如:

#include<iostream>namespace ptr{namespace spa1{int ptr = 1;}namespace spa2{int ptr = 2;	}namespace spa3{int ptr = 3;}
}using std::cout;int main()
{cout << "spa1:  " << ptr::spa1::ptr << std::endl;cout << "spa2:  " << ptr::spa2::ptr << std::endl;cout << "spa3:  " << ptr::spa3::ptr << std::endl;return 0;
}

? ? ? ? ?在C++的一些庫里這種方式也很常見,但是嵌套太多層也是坑的很,還是謹慎使用嵌套功能為好。


三、輸入輸出方式

? ? ? ? C++的輸出方式在最開始也已經(jīng)提到了,cout:控制臺輸出,<<:流插入運算符。那么我們輸出有了,我們輸入呢?

????????在C語言中,我們輸入的方式是調(diào)用<stdio.h>中的scanf函數(shù)來進行輸入,與printf一樣也需要輸入格式訪問控制符才能對輸入數(shù)據(jù)類型進行判斷。

? ? ? ? 在C++中,我們的輸入為:cin(console in控制臺輸入),搭配'>>'(流提取運算符)使用,使用方式為:

std::cin >> 變量;//其中cin與cout一樣會自動識別變量的類型

? ? ? ? ?其中我們在使用輸入輸出的時候就需要包含頭文件<iostream>也就是輸入輸出流文件,保證cout和cin的正常輸入輸出的使用。

? ? ? ? 其中cin和cout都是在std庫內(nèi)的,所以之前在使用的時候要展開std命名空間,這里在介紹一種C++中常用的換行符,不是'\n'而是叫做:endl(end line 結(jié)束行) 通常在cout結(jié)尾處使用,例如:

#include<iostream>int main()
{std::cout << "Hello World" << std::endl;return 0;
}

?其中endl也是內(nèi)置在std庫里的,這樣寫也是會有換行效果的。

? ? ? ? 到這里你可能還有一些疑問,我們如果想要對浮點數(shù)進行精度控制,C++是不是也有新的語法規(guī)則來寫呢?很遺憾并沒有,但是C++語法是兼容C的,所以如果想要對浮點數(shù)進行精度控制的時候,我們直接用printf函數(shù)進行精度控制就行。


四、缺省參數(shù)

? ? ? ? 1)什么是缺省參數(shù)?

? ? ? ? 祖師爺對C語言的函數(shù)部分也不是很滿意,例如在棧的數(shù)據(jù)結(jié)構(gòu)中,在棧的初始化期間,需要傳參capacity容量來給棧開辟空間大小,在C語言中我們每次初始化時都需要給個值,祖師爺覺得有些麻煩,所以在C++里面出現(xiàn)了一個叫做缺省參數(shù)的語法規(guī)則在函數(shù)傳參時直接對參數(shù)進行賦值。

Stack *InitNewStack(int capacity = 3)
{//...
}

?這樣在調(diào)用這個函數(shù)時,不傳參數(shù)就默認capacity初始化為3, 傳參就以傳的參數(shù)為準。

? ? ? ? 那么什么是缺省參數(shù)呢?實際上,缺省參數(shù)是聲明和定義函數(shù)時為函數(shù)的參數(shù)指定一個缺省值,在調(diào)用該函數(shù)時,如果沒有指定實參則采用該形參的缺省值,否則使用指定的實參。

例如:

#include<iostream>using std::cout;
using std::cin;
using std::endl;void Func(int a = 0)
{cout << a << endl;
}int main()
{Func();//沒有參數(shù)時使用形參默認值Func(1);//有參數(shù)時使用指定實參return 0;
}

????????這就是缺省參數(shù)的具體用法。


? ? ? ? 2)多個缺省值的缺省參數(shù)

? ? ? ? 實際上,缺省參數(shù)可以有多個缺省值,而且在多個缺省值當(dāng)中有著全缺省與半缺省之分。全缺省參數(shù)的函數(shù)在調(diào)用時沒有傳實參就會進行自動采用該參數(shù)的缺省值為參數(shù),如果傳參就以實參為參數(shù),這點與上面的相同。

? ? ? ? 如果我們在全缺省函數(shù)傳參傳不完整參數(shù)會發(fā)生什么?我們不妨看以下代碼:

#include<iostream>using std::cout;
using std::cin;
using std::endl;void Func(int a = 0, int b = 1, int c = 2)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}int main()
{Func();//不傳參數(shù)cout << endl;Func(5);//傳一個參數(shù)cout << endl;Func(5, 6);//傳兩個參數(shù)cout << endl;Func(5, 6, 7);//傳三個參數(shù)cout << endl;return 0;
}

?????????

????????我們可以看到,全缺省參數(shù)的函數(shù)是可以傳空參的,也可以傳不完整的參數(shù),同時,不知道聰明的你有沒有發(fā)現(xiàn),這里傳參有個規(guī)律:當(dāng)Func(5),Func(5, 6)的時候,Func(5)是將第一個參數(shù)初始化,后面兩個參數(shù)為缺省值,Func(5, 6)是將前兩個參數(shù)初始化,最后一個參數(shù)為缺省值。這其實就是祖師爺規(guī)定的默認傳參順序,對于全缺省函數(shù)傳不完整參數(shù),是從左到右進行傳參的。

????????或許你又會有疑問,能不能前面不傳參,后面?zhèn)鲄?#xff1f;或者只有中間值傳參?例如:

Func( , 6, 7); 或 Func( , 6 , );?

?????????實際上并不存在這種傳參的方式,C++中這樣是會報錯的,所以缺省參數(shù)只能順序傳參。

還有一種叫做半缺省參數(shù)的函數(shù),所謂半缺省就是函數(shù)參數(shù)一部分是缺省參數(shù),一部分是普通參數(shù),這類函數(shù)被稱為半缺省參數(shù)函數(shù),而且半缺省參數(shù)函數(shù)的缺省值只能從右往左給,例如:

#include<iostream>using std::cout;
using std::cin;
using std::endl;void Func(int a, int b = 1, int c = 2)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}int main()
{Func(0);cout << endl;Func(5);cout << endl;Func(5, 6);cout << endl;Func(5, 6, 7);cout << endl;return 0;
}

? ? ? ? 這個函數(shù)就是一個半缺省函數(shù)?,a沒有缺省值,只有b,c有缺省值,那么運行起來會發(fā)生什么事呢?

? ? ? ? 我們發(fā)現(xiàn)在Func(5, 6)中,?傳的參數(shù)是依舊是從左往右進行傳參的,既然如此,我們半缺省函數(shù)能不能缺省后邊的值或者中間的值呢?

#include<iostream>using std::cout;
using std::cin;
using std::endl;void Func(int a = 0, int b, int c = 2)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}void Func2(int a = 0, int b = 1, int c)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl;
}int main()
{return 0;
}

? ? ? ? 這種會發(fā)生什么情況??? ? ? ? 我們發(fā)現(xiàn)這兩種情況會報錯,但是為什么會報錯?報錯信息顯示形參缺少默認實參,也就是說,我們在傳不完整參數(shù)的時候其實是不能確定你要傳的是缺省參數(shù)還是普通形參,所以干脆C++把這種半缺省方式定義為錯誤的語法方式,最終半缺省函數(shù)傳參只能從右往左進行缺省。

注意缺省參數(shù)函數(shù)的生命和定義不能同時出現(xiàn)缺省值,通常的做法是在聲明時寫缺省值,定義時默認不寫。


五、函數(shù)重載

? ? ? ? 1)什么是函數(shù)重載?

? ? ? ? 祖師爺不僅對函數(shù)的參數(shù)有意見,對函數(shù)的命名也很有意見,有些功能相似的函數(shù),或許只是參數(shù)不同,但是卻要好幾個不同的命名,像在函數(shù)名后面加1,2,3...用來區(qū)分不同的函數(shù),其實也就是為了解決一詞多義的問題,就例如網(wǎng)絡(luò)段子“中國足球誰也贏不了,中國乒乓球誰也贏不了”,雖然都是贏不了,但是意義卻不一樣,祖師爺覺得這樣很麻煩,不如干脆用同一個函數(shù)名得了,于是C++中出現(xiàn)了函數(shù)重載這一語法規(guī)則。

? ? ? ? ?實際上,函數(shù)重載是函數(shù)的一種特殊情況,C++允許在同一個作用域中聲明幾個功能類似的同名函數(shù),這些同名函數(shù)的形參列表(參數(shù)個數(shù) 或 類型順序)不同,常用來處理實現(xiàn)功能類似數(shù)據(jù)類型不同的問題

? ? ? ? 函數(shù)重載又分為:1、參數(shù)類型不同。2、參數(shù)個數(shù)不同。3、參數(shù)順序不同。代碼如下:

#include<iostream>using namespace std;//1、參數(shù)類型不同 
int f(int a, int b)
{cout << "f(int): " << a + b << endl; return a + b;
}double f(int a, double b)
{cout << "f(double): " << a + b << endl;return a + b;
}//2、個數(shù)不同 
void f2(int index)
{cout << "f2(int index)" << endl;
}void f2()
{cout << "f2(NULL)" << endl;
}//3、順序不同
void f3(int a, double b)
{cout << "f3(int, double)" << endl;
}void f3(double a, int b)
{cout << "f3(double, int)" << endl;
}int main()
{f(5, 5);f(3, 3.5);f2(0);f2();f3(4, 4.4);f3(4.4, 4);return 0; 
}

?????????以上都是函數(shù)重載的方式的具體用法。

? ? ? ? 值得注意的是這里并沒有說返回值不同而造成函數(shù)的重載,實際上仔細想想,如果兩個函數(shù)都是相同的,只有返回值不一樣,那么究竟是調(diào)用哪個函數(shù)呢?這就是造成重載的二義性的原因。


? ? ? ? 2)為什么C++可以用函數(shù)重載??

????????在學(xué)習(xí)完函數(shù)重載的過程中,有沒有思考這樣一個問題:為什么這么好用的東西C語言不支持呢?其實這里涉及到程序的編譯與鏈接,實際上程序在從寫下來到打印到控制臺上需要經(jīng)歷預(yù)處理、編譯、匯編、鏈接的幾個過程,如果對于這幾個過程沒有一點概念的同學(xué)可以看看我的這篇文章:C語言預(yù)編譯詳解,可以稍微了解一些。

? ? ? ? 實際上,重載函數(shù)在編譯生成匯編的過程中,C語言對于函數(shù)名并沒有什么特殊的變化,但是C++在編譯生成匯編的過程中函數(shù)名會生成某種符號規(guī)則來確定這個函數(shù)是否為重載。? ? ? ??


六、C++引用與指針

? ? ? ? 我們在日常生活中身邊的朋友不免有些外號,比如我的好朋友玩的好的都叫他‘小李子’,只聽過小李在校園傳奇故事的同學(xué)都叫他‘李哥’,那么這個李哥,和前面的小李,指的就是同一個人,而引用在語法層面上的理解就是,引用就是取別名

? ? ? ? 1)什么是引用?

? ? ? ? 其實上面那個例子就已經(jīng)能夠說明什么是引用了,實際上,引用就是給變量取一個別名,編譯器不會給它專門開一個空間,它與引用的變量共用同一塊內(nèi)存空間。

? ? ? ? 引用的格式如下:

類型& 引用變量名(對象名) = 引用實體;//左值引用

????????這里&符號左右可以帶空格可以不帶空格,沒什么實際影響, 我們來看一下如何給一個引用:

#include<iostream>
#include<stdio.h>using namespace std;int main()
{int a = 0;int &b = a;//b是a的別名cout << "a:" << a << endl << "b:" << b << endl;printf("%p\n",a);printf("%p\n",b);return 0;
}

? ? ? ? ?我們可以看到對于變量a,引用b是變量a的引用,變量b輸出的內(nèi)容是變量a的值,變量a與引用b都是指向同一片地址的。


? ? ? ? 2)引用的規(guī)則特點:
? ? ? ? 1、引用必須初始化才能用
#include<iostream>
#include<stdio.h>using namespace std;int main()
{int a = 1;int &b;return 0;
}

C++規(guī)定引用使用必須初始化。

? ? ? ? 2、引用不能傳空指針
#include<iostream>
#include<stdio.h>using namespace std;int main()
{int a = 1;int& b = nullptr;return 0;
}
??
? ? ?3、一個變量或?qū)ο罂梢杂卸鄠€別名
#include<iostream>
#include<stdio.h>using namespace std;int main()
{int a = 1;int &b = a;int &c = a;int &d = a;cout << a << endl;cout << b << endl;cout << c << endl;cout << d << endl;return 0;
}
? ? ? ? 4、沒有所謂的二級引用
#include<iostream>
#include<stdio.h>using namespace std;int main()
{int a = 1;int &b = a;int &&pb = b;return 0;
}
? ? ? ? 5、引用不能改變指向
#include<iostream>
#include<stdio.h>using namespace std;int main()
{int a = 1;int c = 2;int &b = a;int &b = c;return 0;
}

?以上便是引用的一些規(guī)則的特點。


? ? ? ? 3)引用與指針的區(qū)別?

? ? ? ? 匯編層面上來說,引用就是一個指針,但是不同的是,引用相當(dāng)于常量指針,改變不了它所引用對象的地址

? ? ? ? ?在語法層面上來說:

1、引用是別名,指針存的是地址。

2、指針解引用要加上*,而引用是自動解引用的

3、引用不會分配空間,但是指針會分配空間

4、指針有空指針,但是引用沒有空引用

5、指針運用自增運算符是指向下一位,而引用使用自增運算符是對內(nèi)容+1

6、指針有多級指針,但是引用只有一級引用

7、對指針用sizeof是指針變量的大小,對引用sizeof是引用變量的大小

8、引用比指針更加安全


? ? ? ? 4)引用的使用

????????既然說到引用對象的地址不可改變,值可以變,對于指針來說,值和地都可以隨意改變,他倆相比較下,引用對象的地址不可變,值可變,指針指向?qū)ο蟮牡刂房勺?#xff0c;值也可變。當(dāng)值不可變時又是什么情況呢?

#include<iostream>
#include<stdio.h>using namespace std;int main()
{const int a = 1;int &b = a;return 0;
}

? ????????其實這個時候雖然a被加上了const變成了常量,?但是依然可以通過b對a的值進行修改,這種我們可以稱之為權(quán)限放大,就是b的權(quán)限要高于a了,那么有權(quán)限放大就有權(quán)限縮小與平等權(quán)限,沒錯,實際上權(quán)限縮小就是對a不加任何修飾,對引用b加上const修飾,這樣b不可修改,a卻可以,平等權(quán)限就是兩個變量前都加上const,這樣就都不能改變了。

//權(quán)限縮小
int a = 0;
const int &b = a;
//權(quán)限平等
const int c = 0;
const int &d = c;

? ? ? ? 引用還有什么作用?我們不妨以指針的視角看一下,指針除了可以作為指針變量,指針還可以傳參,還可以作為返回值。那么我們引用是否也可以傳參,作為返回值呢??

????????答案是可以的,而且引用做返回值在一定程度上會提高程序的運行效率。這是因為我們在傳參數(shù)時實際上是拷貝一份實參傳給形參的,而加上了引用就不需要在進行拷貝了,便可以直接訪問內(nèi)容。

? ? ? ? 而引用作為返回值也是比較奇怪的:

#include<iostream>
#include<stdio.h>using namespace std;int& Add(int a, int b)
{int c = a + b;return c;
}int main()
{int a = 1, b = 2;int ind = Add(a, b);cout << ind << endl;return 0;
}

?????????首先,以引用作為返回值表示返回的ind是c的別名,這個就相當(dāng)對在函數(shù)里返回一個局部指針,出了作用域就會銷毀,但是現(xiàn)在的編譯器都比較高級,可能會保留下來這個值,所以就能看到這個值是3,我們再看下面這段代碼:

#include<iostream>
#include<stdio.h>using namespace std;int &Add(int a, int b)
{int c = a + b;return c;
}int main()
{int ind = Add(5,5);cout << ind << endl;Add(3,4);cout << ind << endl;return 0;
}

? ? ? ? ?這里我們兩次調(diào)用了Add這個函數(shù),可是兩次的值都是第一次調(diào)用的結(jié)果(語法規(guī)定除了作用域為隨機值,這里是進行了優(yōu)化),第一次調(diào)用后將調(diào)用的c拷貝了一份給了ind,這時他倆并不指向同一塊空間,所以第二次調(diào)用時并不會影響ind的值。

? ? ? ? 但是我們想要正常運行且能多次調(diào)用呢?看看下面這段代碼:

#include<iostream>
#include<stdio.h>using namespace std;int &Add(int a, int b)
{int c = a + b;return c;
}int main()
{int &ind = Add(5,5);cout << ind << endl;Add(3,4);cout << ind << endl;return 0;
}

? ? ? ? 這里我們將ind為引用來接收引用的返回值,他們指向了同一塊空間,多次調(diào)用時就不會是同一個結(jié)果了。


七、內(nèi)聯(lián)函數(shù)

? ? ? ? 1)什么是內(nèi)聯(lián)函數(shù)?

? ? ? ? 我們在C語言中其實有個很好用的東西————宏,但是學(xué)過C的都知道,宏很難用,雖然它寫的程序運行很快,但是不能進行調(diào)試,特別容易出錯,我們的祖師爺還是比較喜歡宏的,于是祖師爺去劣留優(yōu),也增加了一些新的規(guī)則,創(chuàng)建了一種新的關(guān)鍵字——inline關(guān)鍵字。

? ? ? ? 內(nèi)聯(lián)函數(shù)也就是普通函數(shù)前面加上inline關(guān)鍵字就變成了內(nèi)聯(lián)函數(shù),內(nèi)聯(lián)函數(shù)本質(zhì)上和宏一樣,都是對文本進行替換,而且可以對函數(shù)進行調(diào)試,這樣可以節(jié)省很多函數(shù)調(diào)用銷毀的開銷,但同時會讓目標文件變大。


? ? ? ? 2)內(nèi)聯(lián)函數(shù)的特性

? ? ? ? 這個時候你可能就會說了,那以后每個函數(shù)都用inline關(guān)鍵字不香嗎?實際上內(nèi)聯(lián)函數(shù)的適用場景是短小、多次重復(fù)調(diào)用的函數(shù),因為內(nèi)聯(lián)本質(zhì)上還是文本替換,全都進行展開的話編譯器會吃不消,所以編譯器默認最多你的函數(shù)在10行左右及以下,inline才會有效,否則就是個普通的函數(shù)。

? ? ? ? 內(nèi)聯(lián)函數(shù)的聲明和定義不能分離,在預(yù)處理過程會進行文本替換,替換后函數(shù)的地址就找不到了,那么就會在運行時報錯。


? ? ? ?創(chuàng)作不易,還望各位佬能多多三連【可憐】【可憐】~~

http://www.risenshineclean.com/news/64465.html

相關(guān)文章:

  • 傳奇sf 新開網(wǎng)站百度博客收錄提交入口
  • 搜索引擎優(yōu)化的基本方法成都網(wǎng)站優(yōu)化公司
  • 新手做淘寶哪個網(wǎng)站比較好網(wǎng)絡(luò)營銷七個步驟
  • 做網(wǎng)站用什么軟件語言網(wǎng)站ip查詢
  • 網(wǎng)站建設(shè)1磁力多多
  • 網(wǎng)站品牌推廣韶山seo快速排名
  • 做網(wǎng)站備案照片的要求網(wǎng)頁自助建站
  • 購物網(wǎng)站建設(shè)平臺莆田seo推廣公司
  • 哪個網(wǎng)站可以做簡歷郵件營銷
  • 我是做裝修的怎么樣投資網(wǎng)站個人網(wǎng)站規(guī)劃書模板
  • 安陽市網(wǎng)站建設(shè)的公司企點qq
  • 企業(yè)如何進行網(wǎng)站建設(shè)產(chǎn)品網(wǎng)絡(luò)營銷方案
  • 在百度云上建設(shè)網(wǎng)站如何把品牌推廣出去
  • 廈門網(wǎng)站建設(shè)價google應(yīng)用商店
  • 哪里有手機網(wǎng)站定制服務(wù)器手機怎么自己制作網(wǎng)頁
  • b2b網(wǎng)站黃頁怎么讓百度快速收錄網(wǎng)站
  • 如何建設(shè)阿里巴巴網(wǎng)站游戲推廣平臺
  • 青海省建設(shè)廳建管處網(wǎng)站排名點擊工具
  • 前端做網(wǎng)站使用的軟件工具信息流廣告是什么
  • 英文網(wǎng)站建設(shè)電話咨詢網(wǎng)頁做推廣
  • 沌口網(wǎng)站建設(shè)seo是什么品牌
  • 手機做網(wǎng)站用什么軟件深圳優(yōu)化公司哪家好
  • 網(wǎng)站功能定制優(yōu)化手機流暢度的軟件
  • 網(wǎng)站如何做搜狗搜索引擎百度下載安裝免費
  • 網(wǎng)站建設(shè)公司 南京谷歌seo優(yōu)化中文章
  • 河南省建筑一體化平臺管理系統(tǒng)seo技術(shù)經(jīng)理
  • php動態(tài)網(wǎng)站開發(fā)期末考試網(wǎng)絡(luò)營銷公司名字大全
  • 大渡口網(wǎng)站建設(shè)哪家好武漢網(wǎng)站優(yōu)化公司
  • 免費申請香港網(wǎng)站公司推廣咨詢
  • 吉林市網(wǎng)站制作廣州網(wǎng)站制作服務(wù)