c 臨時物件以及引用的一些知識

2021-10-12 06:49:35 字數 3414 閱讀 6617

一:先來講講什麼是臨時物件。

臨時物件(臨時變數):**中看不見,隱藏在後台,因此我們無法在程式**中看見臨時物件。

臨時物件的產生條件有兩個:1.為使函式呼叫成功而進行隱式型別轉換時用到。 2.函式返回值的時候用到

1.為使函式呼叫成功時

void

conv

(string str)

intmain()

//這種情況下,abcd並不是直接傳給str,而是先傳遞給臨時物件,再由臨時物件傳遞給形參str,因為他們倆的型別不一樣,(對,你沒有看錯,這倆型別就是不一樣,乙個const型別,乙個非const型別,所以需要隱式型別轉換),看下面的圖。

這僅僅是乙個引數,所以複製臨時物件占用的記憶體基本可以忽略,但是我們想一想,實際程式設計中怎麼可能只有一組資料,必定是有大量的資料來呼叫同乙個函式的,這樣每乙個資料我都複製乙個臨時物件,那麼這樣占用的記憶體是非常大的,所以我們要避免讓其產生臨時物件的這種寫法。結合我們之前學的引用傳遞&,我們發現,引用傳遞是不需要進行臨時物件複製的,因此省下了好多記憶體。但是問題結束了嗎?

答案是不可能的,好了,那麼問題又來了,眾所周知引用傳遞是不需要產生臨時物件的,我直接就把實參傳給str,這樣一來就有個小問題,abcd這個字串常量是const型別,但是str是非const型別,把乙個const型別賦給乙個非const型別是不允許的。

因此 下面這種使用引用的寫法會報錯。

那有沒有什麼解決辦法呢?

答案是有的:就是加乙個const,把非const型別的形參str變成const型別。
寫法一:

#include

#include

using

namespace std;

void

conv

(const string &str)

intmain()

寫法二:重要知識點,非const型別的引用時引數只能時相同型別,而const型別可以實現傳遞於此型別相關的引數進來。

#include

#include

using

namespace std;

void

conv

(string &str)

intmain()

2.函式返回值的時候會產生臨時物件(不使用引用&的前提,使用引用或者指標會在下面介紹):

接下來細講函式返回值的其他兩種方式(不產生臨時物件):一是指標,二是引用 。

1.先講講指標返回(區域性變數不能被返回,but why?)

例1:把呼叫的函式直接設定為指標型別

int

*get10()

intmain()

//我們實際執行一下,會發現可以執行,這個時候我們會有疑問,那這樣不是和我前面那個不能返回區域性變數的結論衝突了嗎?

//其實是因為c++的記憶體清理機制是惰性的,它並不會在此函式呼叫完立即清除其占用的記憶體,而是會在下乙個函式進來之後才把上乙個函式的記憶體釋放掉。

所以就有了這個程式可以正常執行的現象,但是我們一定得避免這樣,養成乙個良好的習慣素養。

#include

#include

using

namespace std;

int*

get10()

int*

get20()

intmain()

//這時就出現錯誤了。

;//直接將位址傳入,讓呼叫的函式直接根據指標去原資料快中去修改資料。

2.再講講引用返回(直接返回物件本身,不去再複製臨時物件)

通過使用引用來替代指標,會使 c++ 程式更容易閱讀和維護。c++ 函式可以返回乙個引用,方式與返回乙個指標類似。

當函式返回乙個引用時,則返回乙個指向返回值的隱式指標。這樣,函式就可以放在賦值語句的左邊。例如,請看下面這個簡單的程式:

#include

using

namespace std;

double vals=

;//全域性變數

const

double

&setvalues

(int i )

//在函式名前加個引用號&即可,寫法類似與指標,但是指標那種得在主函式中將承接返回值的變數設定為指標型別。

// 要呼叫上面定義函式的主函式

int main (

)setvalues(1

)=20.23

;// 改變第 2 個元素

setvalues(3

)=70.8

;// 改變第 4 個元素

cout <<

"改變後的值"

*總結:我們必須理解底層的機理,可以有利於提高程式的執行效率,讓**變得更加健壯,

臨時物件的一開一銷很浪費記憶體,所以我們要盡可能的去除。*

*

C 產生的臨時物件引用

統自動生成的臨時物件都是const的 include using namespace std class a class b b a a class b1 public b int main 將b1 const b b 的const修飾符去掉,編譯就不能通過,報錯說沒有匹配的函式,這是為什麼?分析 ...

引用和指標的一些知識

引用並非物件,相反的,它只是為乙個已經存在的物件所起的另外乙個名字。引用即別名 int val 1024 int refval val refval指向val 是val的乙個別名 定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引用。一旦初始化完成,引用將和它的初始值物...

物件導向的一些知識

oop object oriented programming 物件導向程式設計 00d object oriented design 物件導向設計 面向過程 就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步的實現。例如 把大象裝進冰箱裡去。第一步 將冰箱開啟 第二步 將大象放進冰箱 第...