C++引用

来源:http://www.cnblogs.com/tuhooo/archive/2016/04/11/5377406.html
-Advertisement-
Play Games

這個寫的很不錯 http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html 什麼叫引用? 引用就是對某對象的另一個名字。 主要用途: 為了描述函數的參數和返回值,特別是運算符的重載。 用法: X var; X& r = var; 那麼r是 ...


這個寫的很不錯

http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html

什麼叫引用?

引用就是對某對象的另一個名字。

主要用途:

為了描述函數的參數和返回值,特別是運算符的重載。

用法:

X var;

X& r = var;

那麼r是對象var的一個引用,而&在此處是作為引用的標識符而不是區地址。

特點:

(1)引用在創建的時候必須進行初始化,以確保引用會指向某個對象。

int i = 1;

int& r1 = i; //正確:r1被初始化

int& r2; //錯誤:r2沒有被初始化

extern int& r3; //正確:r3在別處被初始化了

(2)所有對引用的操作,都可以看成是對被引用的對象執行的。

void g()

{

int ii = 0;

int& rr = ii;

rr++; //實際上是執行了ii++

int* pp = &rr; //pp指向了ii

}

因此在對應用進行操作時完全可以把引用替換為被引用的對象。

(3)一個引用的值在初始化之後就不可能改變了,它總是引用它初始化所指的那個對象,至死不渝。

(4)可以通過&r來獲取r所指對象的地址。

(5)引用本身並不占有存儲單元,有時候編譯器可以通過優化去掉引用,使得在執行時根本不存在任何表示引用的東西。

(6)對於T&這種引用,屬於變數引用,被引用的類型必須是T的左值,而對於const T&是常量引用,的初始式不必是一個左值,甚至可以不是類型T的,此時:

[1]首先需要將該類型到T類型進行隱式轉換;

[2]隨後將結果存入一個類型為T的臨時變數;

[3]最後將這個臨時變數作為初始式的值。

double& dr = 1; //錯誤,要求左值

const double& cdr = 1; //正確

對於初始化的解釋是

double temp = double(1); //首先建立一個具有正確值的臨時變數

const double& cdr = temp; //用臨時變數作為cdr的初始值

這種保存引用初始式的臨時變數將會一直存在,直到這個引用的作用域結束。

(7)需要區分對變數的引用和對常量的引用,常量引用是不能通過引用對目標變數進行修改的,從而使被引用的目標稱為const,達到一定的安全性。

string foo();

void bar(string& s);

那麼下列的表達式將是非法的:

bar(foo());

bar(“hello world”);

因為foo()和”hello world”串都會產生一個臨時對象,而在C++中,這些臨時對象都是const類型,上面表達式試圖將const類型對象轉為非congst類型對象,是非法的。

(8)可以通過引用來描述一個函數參數,使該函數能夠改變傳進來的該參數的值。

void increment(int& aa) { aa++; }

void f()

{

int x = 1;

increment(x); //x = 2

}

為了提高程式的可讀性,應該避免讓函數去修改它們的參數。相反應該讓函數明確地返回一個值,或者明確要求一個指針參數:

int next(int p) { return p+1; }

void incr(int* p) { (*p)++; }

void g()

{

int x = 1;

increment(x); //x = 2

x = next(x); //x = 3

incr(&x); //x = 4

}

將引用作為參數傳遞進去將會,使得人們強烈感受到參數將被修改。

(9)引用還可以用於定義一些函數,使它們既可以被用於賦值的左邊也可以用於右邊。

(10)不能給數組建立引用,因為數組是若幹元素組成的集合。

引用作為返回值

引用作為返回值需要在函數名前加&

引用作為返回值最大的好處就是記憶體中不產生被返回值的副本。

#include <iostream.h>

float temp;

float fn1(float r);

float &fn2(float r);

float fn1(float r)

{

temp = (float)(r*r*3.14);

return = temp;

}

flaot& fn2(float r)

{

temp = (float)(r*r*3.14);

return temp;

}

void main()

{

float a = fn1(10.0);

float &b = fn1(10.0);

float c = fn2(10.0);

float &d = fn2(10.0);

cout << a << c << d;

}

不能返回局部變數的引用,主要是因為局部變數會在函數返回後被銷毀,因此被返回的引用就成了無所指的引用,使程式進入未知狀態。

不能返回函數內部new分配的記憶體引用,雖然不存在被動銷毀的問題,對於這種情況(返回函數內部new分配記憶體的使用),又面臨其他尷尬局面,例如函數返回的引用只是作為一個臨時變數出現,而沒有被賦予一個時間的變數,那麼這個引用所指向的空間就無法釋放,造成memory leak。

可以返回類成員的引用,但最好是const,主要是當對象的屬性與某種業務關聯時,其賦值常常與某些其他的屬性或者對象的狀態有關,如果獲得了非常量的引用則會導致單純賦值破壞業務規則的完整性。

引用與一些操作符重載,這還是與引用可以作為左值有關。

引用和多態


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • flex 訪問WebService的方法有很多種,使用FLEX4中的"數據/服務"功能可以自動生成訪問WebService的代理類,這樣可以避免把所有的數據訪問都寫到MXML頁面上,便於重覆利用,同時可以直接導入後臺自定義數據類型,方便傳參。 直接上代碼:其中WebService介面 ? 1 2 3 ...
  • 閱讀目錄 開始 簡單使用 非同步調用WebServeices WebServices驗證 相關概念及資源 WebServices:簡單理解--解決了不同平臺之間應用程式間通信的問題,數據以XML格式在程式間傳輸 實際的應用場景:例如 比價網 為什麼比價網可以從眾多的電商站點獲得用戶搜索的產品數據?We ...
  • 首先來說,委托的作用就是可以給類的方法傳遞其他類的方法而不必將類實例化。第二點,委托就是事件和響應事件的方法的橋梁(就是傳遞響應事件的方法給事件)。這裡要註意,委托跟類平級,事件與方法平級。 全文 事件與委托似乎很難以理解,這是因為它們的使用方式與常用的編碼有很大的差別,例如通常編寫的都是同步代碼, ...
  • 分類:Unity、C#、VS2015 創建日期:2016-04-11 一、簡介 在地形編輯器一節中,已經告訴了你如何使用已經創建好的樹來形成大片樹林。這一節告訴你在 Unity 5.3.4中如何利用【樹木創建器】一步一步地創建一棵樹: 當你學會了創建樹的基本操作後,你就可以根據自己的需要創建任意形狀... ...
  • 先拿出我半前年前平臺的設計初稿,經過半年的努力我已經完成了該設計稿的所有功能。並且理念已經遠遠超出該設計稿。 下麵是一些博友對我貼子的評價: 1、樓主,想法很美好,現實很骨感,我們公司就有一套你說的這樣的平臺,界面都是用XML配置出來的,雖然開發效率很高,但只能做固定版式的系統,有任何版式的修改,幾 ...
  • 這幾個月一直忙APP的項目,沒來得及更新項目,想想該抽出時間整理一下開發思路,跟大家分享,同時也希望得到寶貴的建議。 先說一下我們的許可權管理的的設計思路,首先一個企業信息化管理系統一定會用到許可權管理, 那麼一個動態的菜單在企業信息化管理系統占有一定的分量。 下麵介紹我的一些思路。 由於原聲的winf ...
  • SignalR支持多種伺服器和客戶端配置。此外,每種傳輸方式都有自身的要求限制;如果某種傳輸方式不被系統支持,SignalR能夠優雅地將故障轉移到其他類型的傳輸方式。關於SignalR所支持的傳輸方式的詳細信息,參見: Transports and Fallbacks。 系統要求 SignalR服務 ...
  • 當我們運行java程式時,發現程式不動,但又不知道是哪裡出問題時,可以使用JDK自帶的jstack工具去定位; 廢話不說,直接上例子吧,在window平臺上的; 死迴圈 寫個死迴圈的程式如下: 先運行以上程式,程式進入死迴圈; 打開cmd,輸入tasklist,找到javaw.exe的PID,如下為 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...