C 中既然引用就是起別名,有什麼存在的必要呢?

時間 2021-05-11 13:20:24

1樓:飛翔的荷蘭豬

引用的目的是用同乙個別名,去稱呼不同的人。而不是給同乙個人起不同的別名。

比如int f(int& a)

我們可以把所有int變數傳給f函式,而在f函式中,把這些變數統一稱為a。

初學者理解,如有偏差,還請不吝賜教。

2樓:

上說得很清楚,

1,大體上相當於更安全的指標,所以推薦盡可能用&代替*2,作為函式引數時,可以把引數分配在堆上而不是棧上,這樣實現swap(a,b)這樣的功能就很簡單

3,作為函式引數時,如果是內建簡單資料型別比如int,用不用&沒多大區別,這個功能主要是為了傳遞class這樣的複雜資料型別,從碼農體驗來說可以像傳簡單資料那樣傳遞複雜資料。

其他忘了,你可以去找這本書看看,在第一章或第二章某一頁上解釋得很清楚。

3樓:Lightning34

1.主要是為了避免拷貝,這種情況一般出現在函式引數裡。

2.定義一些等於、加等於這樣的運算理應返回引用而不是變數的值。

3.節省時間上的開銷,例如需要對乙個map裡的某個值反覆操作的時候,不使用引用的話每一次用這個值都要重新查詢一遍。

4樓:

如果在沒有引用下

vector.at(0)返回乙個值? 直接強行拷貝?

還是說直接返回乙個指標?

那如果vector.at(0)呢? 返回 ** 嗎?

5樓:望山

書上假如說引用「是」別名,那是錯誤的。引用的內部實現多數情況下是dereference乙個匿名指標,其實它不是原始變數的另一種寫法,倒更像是指標的另一種寫法。只是程式設計師眼裡,在許多表示式裡好像引用跟原始變數可以互相替代似的,然而能搞清楚兩個概念的區別才是好程式設計師。

6樓:王旭競

意義很大,主要是用來簡化語法複雜度的。舉個例子:

struct student_t;

student_t student1;

auto fn_base = [&](auto *student);

auto fn_call = [&](auto *student);

auto fn_call_ref = [&](auto &student){

fn_base_ref(student);

fn_base_ref(student1呼叫形式一致 fn_base_ref( student );

7樓:

我在舉個例子..比如你自己定義了乙個class, 叫做 myArray, 你想要overload , 比如 myArray[0]=10. 這時候你寫的 operator必須返回reference才能實現,你要是返回乙個值根本沒意義。

我覺得好好搞懂pass by reference, by value, 以及各種revalue, lvalue對程式設計都會有很大幫助。

8樓:中玉

在初學c++的時候,用引用是為了解決它「不能返回多個值」的問題,因為採取引用傳遞的函式能改變引數的值。

後來使用 const 引用傳參來避免複製,因為有些複雜物件的複製開銷是相當大的。

9樓:list

單個引用可能還能想辦法取代,引用陣列你怎麼期待,乙個陣列存了對一百個變數的引用,乙個迴圈就可以全部訪問了,你用變數本體怎麼搞?

10樓:靈劍

主要為了引用傳參,省去乙個取指標符號。這在許多時候都是有用的,尤其在模板程式設計的時候,不管是void func(int)還是void func(const MyInt&)都可以通過func(t)來呼叫,具體傳值還是傳引用不需要區分。否則就必須在傳值的時候用func(t),傳引用的時候用func(&t)了。

邏輯上來說,呼叫方只負責給出需要的引數,而使用方決定要值還是要引用,這是比較合理得。

11樓:

你對程式語言的理解有點問題……程式語言也是一門語言,任何語言的別名都是有意義的。自然語言裡我們也會給同乙個事物起兩個不同的名字。

沒有別名才令人感到難以理解,肯定是影響表達能力的。大多數高階語言都是只有引用而沒有指標的。C語言雖然只有值拷貝,但不過是把引用的實現暴露出來而已。

指標的傳值其實不就是物件的傳引用嗎?C++引用令人困惑的地方可能是因為本身還有指標型別吧,這是為了相容C所付出的代價。

12樓:機犬

從語法層面限制行為、更安全、更方便什麼的我就不提了,乙個問題,如果沒有引用,那 *ptr 和 array[8] 是什麼型別?

初學 C++ 可能覺得反正 C 裡有指標了,真是脫褲子放屁,但寫 C++ 久了才覺得,這真的是在給 C 擦屁股,乙個不惜破壞了 C 宣告格式也要添上的草紙。

當然最大的問題還是 C 區分 . 和 ->,還是歷史遺留的鍋,像其他答主說的,到設計操作符過載的時候也沒其他辦法了。

13樓:「已登出」

在一些情況比指標好用,比如引用的型別和原來的型別是一致的,deref是自動的這種

所以說如果c++加入了自動deref的設定,就不需要引用了吧233

14樓:洛筋

你把變數當成你自己, 把引用當成你的名字來理解就好了, 你戶口本裡只需要你的名字, 並不需要複製乙個你放到戶口本裡

void swap(class A &a, class A &b)

15樓:暮無井見鈴

首先引用繫結到的是物件,物件和引用都可以是變數。

變數名是有作用域的,當你需要在名稱的作用域外(譬如另一函式中)訪問該物件時,引用就有意義。

另外個人反對「引用是靠指標實現」這種說法。可以說「引用需要占用記憶體時,占用方式一般和指標一樣」,但指標並不比引用更基礎,而且 C++ 中也不能只靠指標寫出引用。

16樓:

乙個是傳引數的時候可以傳引用型別,這個不多說,你自己看了就知道有什麼用。

還有乙個是有的變數是沒有變數名的,比如 struct 的某個屬性,如果沒有別名的話每次都要寫 some_struct.some_property,起乙個別名寫起來更方便且更清晰。

17樓:

因為不少地方要靠引用實現。比如拷貝建構函式。如果使用物件本身會造成無限遞迴。

引用本身是靠指標實現的。但是又比指標安全。效率差不多。所以在可能的情況下推薦使用引用。有效率優勢。

18樓:Milo Yip

引用作為函式傳參型別能避免拷貝;

拷貝構造和運算子過載都應使用引用型別引數;

重複使用多次的複雜表示式可用引用,可避免重複求值,具名的引用也可令程式更易讀;

相對於指標,引用在使用時更簡單一些,也不應有空指標(null pointer)(空引用是 UB 的)。

C 中引用有什麼用?

海賊王panther 一般是為了函式傳參方便,例如在交換兩個數的函式中 1 沒有使用引用 void fun int a,int b int x 1,y 2 fun x,y 2 使用引用 此處 為引用 void fun int a,int b 函式呼叫 int x 1,y 2 fun x,y 這樣就使...

C 中,既然有了建構函式, 那麼拷貝建構函式存在的意義是?

白白小白 copy constructor 建立物件的時候,用同一類的物件對它進行初始化的時候會自動呼叫拷貝建構函式。Aa Ab a 或者傳參Ab f b 或者返回值是物件Af 語法 public A constA a 我們首先希望傳參的時候不會對原來的物件產生修改,所以使用了const型別 避免迴...

C 中的 this 為什麼是指標而不是引用?

中二青年 這個是c 作者的個人主頁,可以看一下答案,裡面還回答了,為什麼引入ref的原因。Why is this not a reference?Because this was introduced into C really into C with Classes before referenc...