1. 程式人生 > >C++ 使用const 引用傳遞引數

C++ 使用const 引用傳遞引數

類似const & int 的形式是C++的常量引用,在函式引數引數列表中常使用const的引用。

引用的作用是防止值傳遞,這樣可以提高程式碼效率,這種設計策略還能使函式執行的更快,而const是防止誤修改函式引數的值。對於一個函式來講,我們以前都知道函式傳遞時值傳遞,也就是說,我們在函式呼叫時,會為形參重新分配記憶體,並將實參的值拷貝進去,例如:

void func(int a,int b)
{
    //...
}
int main()
{
    int aa=3;
    int bb=4;
    func(aa,bb);
    return 0;
}

以前我們知道在func()

函式中,會重新分配記憶體並將實參aa和bb的值分別放進去,這種值傳遞的拷貝,當引數是結構複雜的結構體時,就大大的浪費儲存了。
所以,使用const 引用可以在保證引數不被修改的前提下,防止資料的值傳遞拷貝。

最近,在看函式模板時《C++ Primer》(第五版)581頁,提到編寫泛型程式碼的兩個重要原則,其中之一就是:
模板中的函式引數是const的引用
其給出的解釋就很清楚了:
通過將函式引數設定為const的引用,我們保證了函式可以用於不能拷貝的型別。當然大多數型別都是允許拷貝的,但是不允許拷貝的類型別也是存在的。

相關推薦

C++ 使用const 引用傳遞引數

類似const & int 的形式是C++的常量引用,在函式引數引數列表中常使用const的引用。 引用的作用是防止值傳遞,這樣可以提高程式碼效率,這種設計策略還能使函式執行的更快,而const是防止誤修改函式引數的值。對於一個函式來講,我們以前都知道

C++ const引用、臨時變數 引用引數

C++引用—臨時變數、引用引數和const引用 如果實參與引用引數不匹配,C++將生成臨時變數。如果引用引數是const,則編譯器在下面兩種情況下生成臨時變數:          實參型別是正確的,但不是左值          實參型別不正確,但可以轉換為正確的型別 左值引

C#形參,實參,值傳遞引數引用傳遞引數,輸出引數引數陣列的學習

1)形參 形參顧名思義就是形式上的引數,不是實際的引數,它代替實際傳入方法的值。在方法體程式碼中代表了值本身參與運算。形參定義於引數中,它不同於方法體內區域性變數,因為是一個變數,在它的作用域內不允許存在一個同名的區域性變數,不管他們的型別是否相同,都是不允許出現同名的

C++ main 方法傳遞引數

示例程式碼如下: #include <iostream> using namespace std; int main(int argc, char * argv[]) { //如果你需要2個引數,這裡就 與 3 做判斷,可自行嘗試 if (argc != 3) {

C++ const 引用 指標答疑

常變數 const int a 常引用 const int &a 常指標 const int *a const * int a 用法1:常量     取代了C中的巨集定義,宣告時必須進行初始化(!c++類中則不然)。const限制了常量

又被引用傳遞引數坑了

雖然這個問題從我入門那一天起就知道了,可是很不幸的,剛剛刷題又陷進去了。 以Java為例做說明: 關於Java引數引用的說明 Java中只有值傳遞,不管是原始型別還是引用型別,傳遞的都是副本。 ①如果引數型別是原始型別,那麼傳過來的就是這個引數的一個副本,也就是這個原始引數的值。&n

c++模組間傳遞引數的一些經驗教訓

最近在開發一套新產品,測試中發現了一些UI奔潰,自己在設計模組通訊介面方面考慮不周全,在此做一下記錄。 需求: 兩個模組,UI排程模組以及實際功能模組。UI排程模組需要呼叫功能模組,獲取資料,顯示在UI上面。 // 之前的做法: 1.在

Javascript 呼叫C# 程式碼並傳遞引數的兩種方法

             Javascript呼叫C#程式碼的方法網上介紹了很多種方法,也很詳細,但沒有向C#傳遞引數的方法。今天剛好用到,搞了半天才搞出來(其實我很笨)。下面說一下具體實現的方法。 一、使用HiddenField 控制元件。      HiddenField

python中是按值傳遞引數還是按引用傳遞引數

在學習python函式的時候,遇到了一個非常有趣的問題: 在函式中的引數是如何傳遞的:是傳值?還是傳引用?當然,結果我們是知道的,肯定是傳引用的。 現在,我們來測一下我們的結論: ===== 修改li

[轉載]C++中引用傳遞與指標傳遞區別(進一步整理)

這篇文章是在學習了編譯原理引數傳遞後對c++和Java按引用傳遞的不同表現產生疑問,在網上搜索找到的博文,這裡提出了按地址傳遞和按引用傳遞是不同的,按我的個人理解,Java的物件引數的傳遞,是按地址傳遞,而按地址傳遞,需要有一個傳遞到被呼叫函式的指向實

寧以const引用傳遞代替按值傳遞(內建型別除外)

預設的情況下C++是按值傳遞的,這可能付出昂貴的代價(費時)。 看看下面的程式碼吧: class Person { public: Person(); virtual ~Person(); ... private: s

【Qt】訊號和槽對值傳遞引數引用傳遞引數的總結

在同一個執行緒中 當訊號和槽都在同一個執行緒中時,值傳遞引數和引用傳遞引數有區別: 值傳遞會複製物件;(測試時,列印傳遞前後的地址不同) 引用傳遞不會複製物件;(測試時,列印傳遞前後的地址相同)

C#中引用傳遞與指標傳遞區別

從概念上講。指標從本質上講就是存放變數地址的一個變數,在邏輯上是獨立的,它可以被改變,包括其所指向的地址的改變和其指向的地址中所存放的資料的改變。 而引用是一個別名,它在邏輯上不是獨立的,它的存在具有依附性,所以引用必須在一開始就被初始化,而且其引用的物件在其整個生命週

C++中引用傳遞參數的效率分析

傳遞參數 進行 上傳 自定義 函數定義 因此 clas 指針 struct 眾所周知,在C++中有三種參數傳遞的方式: 按值傳遞(pass by value) #include <iostream> using namespace std; void s

C#系列 ---5 函式引數 optional , ref, out, params 和 引數值傳遞引用傳遞問題

variables and parameters variable 代表的是一個記憶體地址,該地址包含一個可變的值。可以是local variable, parameter (value, ref, or out), field (instance or static), or arra

C#中值型別和引用型別引數傳遞

原則:儘可能控制對資料的修改,如果可以預測某個資料不會或不應該被改變,就要對其控制,而不要期望使用這個資料的呼叫者不會改變其值。 如果引數在使用過程中被意外修改,將會帶來不可預知的結果,而且這種錯誤很難被檢查到,所以我們在設計方法引數的時候,要充分考慮傳遞引用型別引數或者引用方式傳遞引用型別

C# 當陣列引數引用傳遞 new 解惑

請看下面程式碼: 1 static void Main(string[] args) 2 { 3 int[] a = new int[]{ 1, 2, 3 }; 4 Test_1(a); 5 Console.WriteLine(string.Join(",", a)

C# 當陣列引數引用傳遞 遇上 new

請看下面程式碼: static void Main(string[] args) { int[] a = new int[]{ 1, 2, 3 }; Test_1(a); Console.WriteLine(string.Join(",", a)); Test_

const引用做形參---函式引數傳遞,並不都是複製

     使用引用做形參,可以直接訪問實參物件,並改變實參內容,而不是將實參複製給形參,所以在大資料傳遞時, 用引用做形參可以提高效率。 void f(int& x)//引用做形參 { x=7; } int main() { int y=0;

C++三種引數傳遞方法(值傳遞、指標傳遞引用傳遞)的一些知識

        C++的函式引數傳遞有三種方法:值傳遞、引用傳遞、指標傳遞 。其中引用傳遞和指標傳遞幾乎一樣,只不過引用傳遞在使用時比指標更安全。        (1)關於函式返回一個物件         當你的函式返回型別是【非引用】的型別時,return時先呼叫該類的拷