C++入門基礎(2)

目錄

一、引用:

1、定義:

?2、特性:

?3、引用的使用:

4、const引用:控制權限

const引用定義:

const引用可以接收3種對象:

1、正常對象:

2、臨時對象:

3、const對象:

總結:

5、引用與指針的關系:

二、內聯函數:

?編輯?三、nullptr:

四、總結:


一、引用:

1、定義:

? ? ? ???引?不是新定義?個變量,?是給已存在變量取了?個別名,編譯器不會為引?變量開辟內存空間,它和它引?的變量共?同?塊內存空間。?如:?壺傳中李逵,宋江叫"鐵?",江湖上?稱"?旋?";林沖,外號豹?頭??


👉👉 類型& 引?別名 =? 引?對象

???引用的出現代替了指針,對引用進行修改,就相當于對本名(引用對象)進行修改

?2、特性:

//在定義時要初始化
//一個變量可以有多個引用
//引用一旦引用一個實體,再不能引用其他實體

初始化,決定了別名,該別名就一直是a的別名



?已經有了實體了,不會引用其他的實體

?

?3、引用的使用:

1. 引?在實踐中主要是于引?傳參引?做返回值減少拷?提?效率改變引?對象時同時改變被引?對象

2.引?傳參跟指針傳參功能是類似的,引?傳參相對更?便?些。

3. 引?和指針在實踐中相輔相成,功能有重疊性,但是各有特點互相不可替代。C++的引?跟其語?的引?(如Java)是有很?的區別的,除了?法,最?的點,C++引?定義后不能改變指向,Java的引?可以改變指向。

4.?些主要?C代碼實現版本數據結構教材中,使?C++引?替代指針傳參,?的是簡化程序,避開復雜的指針



4、const引用:控制權限

先補充一點說明:?臨時對象

臨時對象:編譯器需要?個空間暫存表達式的求值結果臨時創建的?個未命名的對象,C++中把這個未命名對象叫做臨時對象;

?👉🤔臨時對象也就是存放一些結果的變量,使用完后會銷毀

?C++規定:臨時對象具有常性(只能讀,不能改)

//表達式求值
// 1、a+b 表達式運算
// 2、int a = 1; double b = a;a轉換成double型(隱式類型的轉換)
//3、整形提升
//4、傳值調用的返回值
//5、截斷
//………………

const引用定義:

????????可以引??個const對象,但是必須?const引?。const引?也可以引?普通對象,因為對象的訪問權限在引?過程中可以縮?但是不能放?!!!!權限小了,也就是不能進行修改了

👉總之:引用可以引用 權限比自己大的,但是不能引用 權限比自己小的,自己的權限必須和引用對象的權限相同,或者比引用對象小!!

const引用可以接收3種對象:

1、正常對象:
int main()
{int a = 10;const int& b = a;//權限縮小return 0;
}

🧑?🎓🧑?🎓但是 b不能修改a的值因為此時b的權限縮小了《《只能讀,不能修改

👉👉但是a可以進行修改

2、臨時對象:
int main()
{double a = 10;const int& b = a;//int& b = a;不可以return 0;
}

🧑?🎓🧑?🎓臨時對象具有常性,因為要發生隱式轉換,對于常性,它的權限是只讀不可改,那么我們就要一個只讀不可改的引用即const引用


對于常量也可以使用引用,但是根據權限對應,需要使用const引用才行,當然也不能給常量進行修改

int main()
{//int& a = 10;錯誤的引用,常量的權限是只讀不可改const int& a = 10;return 0;
}
3、const對象:
int main()
{const int a = 10;//具有了常屬性const int& b = a;return 0;
}

🧑?🎓🧑?🎓對于const的對象進行引用時,必須用同等權限的引用,即const引用;?

總結:

const引用就是改變了引用的控制權限權限,其權限滿足如下表達式

5、引用與指針的關系:

🧑?🎓🧑?🎓 C++中指針和引?就像兩個性格迥異的親兄弟,指針是哥哥引?是弟弟,在實踐中他們相輔相成功能有重疊性,但是各有??的特點互相不可替代

?//語法概念上引?是?個變量的取別名不開空間,指針是存儲?個變量地址,要開空間。//? 引?在定義時必須初始化,指針建議初始化,但是語法上不是必須的。//? 引?在初始化時引??個對象后,就不能再引?其他對象;?指針可以在不斷地改變指向對象。//? 引?可以直接訪問指向對象,指針需要解引?才是訪問指向對象。//? sizeof中含義不同,引?結果為引?類型的??,但指針始終是地址空間所占字節個數(32位平臺下占4個字節,64位下是8byte)//? 指針很容易出現空指針和野指針的問題,引?很少出現,引?使?起來相對更安全?些

二、內聯函數:

關鍵字inline + 函數聲明

🧑?🎓🧑?🎓inline修飾函數,編譯時C++編譯器會在調?的地?展開內聯函數,這樣調?內聯函數就不需要建?棧幀了,就可以提?效率

🧑?🎓🧑?🎓inline對于編譯器??只是?個建議(我和你說一聲,聽不聽,取決于你的想法,我無法左右你必須聽我的),也就是說,你加了inline 編譯器可以?選擇在調?的地?不展開,不同編譯器關于inline什么情況展開各不相同,因為C++標準沒有規定這個。??inline適?于頻繁調?的短?函數,對于遞歸函數,代碼相對多?些的函數,加上inline也會被編譯器忽略展開太多了,代碼量會太大??

???C語?實現宏函數也會在預處理時替換展開,但是宏函數實現很復雜很容易出錯的,且不?便調試,C++設計了inline?的就是替代C的宏函數

注意:inline不建議聲明和定義分離到兩個?件(分裝),分離會導致鏈接錯誤。因為inline被展開,就沒有函數地址,鏈接時會出現報錯。


?三、nullptr:

C++中NULL可能被定義為字?常量0,或者 C中被定義為?類型指針(void*)的常量。🧑?🎓🧑?🎓不論采取何種定義,在使?空值的指針時,都不可避免的會遇到?些?煩;

🧑?🎓🧑?🎓 C++11中引?nullptr,nullptr是?個特殊的關鍵字,nullptr是?種特殊類型的字?量,它可以轉換成任意其他類型的指針類型。使?nullptr定義空指針可以避免類型轉換的問題,因為nullptr只能被隱式地轉換為指針類型?不能被轉換為整數類型


🧑?🎓🧑?🎓C++不允許void*類型的數據給其他類型的指針,必須墻磚同類型;

void f1(int x)
{cout << "f(int x)" << endl;
} 
void f1(int* ptr)
{cout << "f(int* ptr)" << endl;
} 
int main()
{f1(0);// f1(NULL);//相當于傳一個常數0f1((int*)NULL);// f1((void*)NULL);將NULL強轉為指針類型f1(nullptr);//空指針return 0;
}

nullptr相當于c語言中的NULL,但是不能轉換成整形

四、總結:

?繼續努力!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42725.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42725.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42725.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++筆試強訓3

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、選擇題1-5題6-10題 二、編程題題目一題目二 一、選擇題 1-5題 如圖所示&#xff0c;如圖所示p-3指向的元素是6&#xff0c;printf里面的是%s&#xff0c;從6開…

Java爬蟲翻頁

編寫一個Java爬蟲以進行翻頁通常涉及到使用HTTP客戶端&#xff08;如Apache HttpClient或OkHttp&#xff09;來發送請求&#xff0c;解析HTML頁面&#xff08;如使用Jsoup庫&#xff09;&#xff0c;以及處理分頁邏輯&#xff08;如通過URL參數或頁面內的鏈接進行翻頁&#xff…

華為機試HJ108求最小公倍數

華為機試HJ108求最小公倍數 題目&#xff1a; 想法&#xff1a; 要找到輸入的兩個數的最小公倍數&#xff0c;這個最小公倍數要大于等于其中最大的那個數值&#xff0c;遍歷最大的那個數值的倍數&#xff0c;最大的最小公倍數就是輸入的兩個數值的乘積 input_number_list i…

C++休眠的方法

Windows的API函數 Sleep(INFINITE); 休眠時間為永久 Linux的API函數sleep 沒有直接表示無限時間的參數&#xff0c;根據POSIX標準&#xff0c;sleep() 函數的參數應該是 unsigned int 類型&#xff0c;因此最大可以接受的參數值是 UINT_MAX&#xff0c;即 4294967295 秒。sleep…

OpenFWI代碼

重點關注文章第4部分 一、代碼模塊概覽 這一部分了解代碼主要實現的功能有哪些。 二、運行 這一部分關注如何跑通。 三、數據集 12個數據集&#xff08;11個2D1個3D&#xff09; 對計算機而言&#xff0c;上述輸入、輸出維度大小是按次數定義的。 以“Vel&#xff0c;F…

線程池【開發實踐】

文章目錄 一、為什么要用線程池1.1 單線程的問題1.2 手動創建多線程的問題1.3 線程池的作用&#xff08;優點&#xff09;1.4 線程池的使用場景 二、線程池的基礎知識2.1 線程池的核心組件2.2 JUC中的線程池架構2.3 線程池的配置參數2.4 線程池常見的拒絕策略&#xff08;可自定…

appium 實戰問題 播放視頻時無法定位到元素

背景 在做UI自動化時&#xff0c;有播放詳情頁的用例&#xff0c;但是發現視頻在播放的時候無法定位到元素或者很慢&#xff0c;了解到appium在動態的頁面實時獲取布局元素導致定位變慢。所以只能將視頻暫停在操作元素&#xff0c;點擊到暫停按鈕又是個問題&#xff0c;通過ad…

昇思25天學習打卡營第21天|LSTM+CRF序列標注

1. 學習內容復盤 概述 序列標注指給定輸入序列&#xff0c;給序列中每個Token進行標注標簽的過程。序列標注問題通常用于從文本中進行信息抽取&#xff0c;包括分詞(Word Segmentation)、詞性標注(Position Tagging)、命名實體識別(Named Entity Recognition, NER)等。以命名…

Spring Boot項目中JPA操作視圖會改變原表嗎?

一直有一種認識就是:使用JPA對視圖操作,不會影響到原表。 直觀的原因就是視圖是一種數據庫中的虛擬表,它由一個或多個表中的數據通過SQL查詢組成。視圖不包含數據本身,而是保存了一條SQL查詢,這條查詢是用來展示數據的。 但是在實際項目種的一個場景顛覆和糾正了這個認識…

匯川伺服 (4)FFT、機械特性、閉環、慣量、剛性、抑制振動

一、參數解釋 二、FFT 三、機械特性分析 四、多級配方與對象字典 對機組網配方 對象字典 五、InoServoShop 主要是用于調試620P620N將壓縮報解壓后不需要安裝就可以直接使用 六、InoDriveWorkShop 主要是調試660 670 810 520 等系列 慣量識別 Etune Stune 慣量比調試 大慣…

Error:sql: expected 1 arguments, got 2

一 背景 在測試一個API接口時&#xff0c;看到日志里面突然拋出一個錯誤&#xff1a;Error:sql: expected 1 arguments, got 2 看了下&#xff0c;對應的表里面是有相關數據的&#xff0c;sql語句放在mysql里面執行也是沒問題&#xff01;那奇了怪了&#xff0c;為啥會產生這樣…

git只列出本地分支

git只列出本地分支 git branch --list git強制刪除本地分支 git branch -D_error: the branch dlx-test is not fully merged. -CSDN博客文章瀏覽閱讀648次。git branch -d 可以通過: git branch 查看所有本地分支及其名字&#xff0c;然后刪除特定分支。git刪除遠程remote分支…

算法之工程化內容(2)—— Git常用命令

目錄 1. git初始化配置 2. 新建倉庫 3. 工作區——>暫存區——>本地倉庫 4. git reset回退版本 5. 查看差異 git diff 6. 刪除文件git rm 7. .gitignore 8. vscode操作git 9. git分支、合并和刪除 10. 解決合并沖突 11. 回退和rebase 12. 添加遠程倉庫 參考鏈接&#xff…

【Go語言】Go語言的占位符

Go語言的占位符 Golang 的字符串占位符在 fmt 包的各種打印函數中使用&#xff0c;如 fmt.Printf、fmt.Sprintf。 變量值與類型的打印 %v: 打印變量的值 %v 會根據變量的類型選擇合適的格式進行打印。對于結構體&#xff0c;%v 會打印出結構體的字段。對于指針類型&#xf…

Linux 網絡--TCP協議收包流程(NAPI機制)

Linux 網絡--TCP協議收包流程&#xff08;NAPI機制&#xff09; 平臺環境簡介&#xff1a;宿主機: ubuntu18.04Linux內核源碼版本: Linux-4.15網卡驅動: Intel e1000 &#xff08;ubuntu 虛擬機默認網卡驅動&#xff09;協議&#xff1a;TCP協議&#xff0c;本文分析收包過程 本…

緩存新境界:Eureka中服務的分布式緩存實現策略

緩存新境界&#xff1a;Eureka中服務的分布式緩存實現策略 引言 在微服務架構中&#xff0c;服務間的通信和數據交換頻繁&#xff0c;引入分布式緩存可以顯著提高系統性能和響應速度。Eureka作為Netflix開源的服務發現框架&#xff0c;雖然本身不提供緩存機制&#xff0c;但可…

【線程狀態-2】

1、線程禮讓 &#xff08;1&#xff09;禮讓線程&#xff0c;讓當前正在執行的線程暫停&#xff0c;但不阻塞 &#xff08;2&#xff09;將線程從運行狀態轉為就緒狀態 &#xff08;3&#xff09;讓cpu重新調度&#xff0c;禮讓不一定成功&#xff01;看cpu心情 package st…

單對以太網:工業4.0時代的通信革命

單對以太網連接器概述 單對以太網&#xff08;Single Pair Ethernet&#xff0c;簡稱SPE&#xff09;是一種新興的以太網技術&#xff0c;它通過一對雙絞線實現數據傳輸&#xff0c;支持PoDL&#xff08;Power over Data Line&#xff09;技術&#xff0c;為終端設備提供電力供…

【AI工具介紹】— webkit簡介

目錄 一、起源與發展 二、核心組件與功能 三、特性與優勢 四、應用與影響 五、結論 一、起源與發展 WebKit起源于蘋果公司&#xff0c;最初是為了開發Safari瀏覽器而創建的。WebKit項目的起源可以追溯到蘋果公司在2001年推出基于Unix的操作系統Mac OS X時&#xff0c;對瀏…

windows JDK11 與JDK1.8自動切換,以及切換后失效的問題

1.windows安裝不同環境的jdk 2.切換jdk 3.切換失敗 原因&#xff1a;這是因為當我們安裝并配置好JDK11之后它會自動生成一個環境變量&#xff08;此變量我們看不到&#xff09;&#xff0c;此環境變量優先級較高&#xff0c;導致我們在切換回JDK8后系統會先讀取到JDK11生成的…