c 陷阱之臨時變數

2021-05-22 00:06:13 字數 931 閱讀 4517

1.向上強制型別轉化產生臨時變數

#include

class base

void say();

}; class drived:public base

;    

int main()

我們開始都會認為在呼叫say()之後,物件d的m_b成員變數會被修改為7但是結果卻輸出「1」,原因如下:

這段**是將物件d的內容拷貝到臨時變數中,並且只拷貝base中有的部分,這樣做

就是所謂的「slicing」。有些書中說這一步是由拷貝建構函式完成的。概念上是這樣的,

但是實際上,編譯器並沒有生成乙個真正意義上的拷貝建構函式。

這更進一步說明c++產生了乙個臨時物件作為強制轉換的中間結果。然後以這個臨時

物件代替我們的物件d,來呼叫函式say()。那麼結果自然是,臨時變數的m_b被改變,

而我們的d.m_b沒有發生變化

這種強制型別轉換就是所謂的"向上轉型",upcasting。 也叫object slicing。這種操作應該小心使用,甚至避免

2.臨時變數被儲存在暫存器中

void f1( int * &j) 

void any_function_use_local_variables() 

int main() 

上面的例子輸出的結果為: 20 1000 4383304

我是這樣理解的,如有不妥,還請各位高人指點。

int *&j可以這麼理解

typedef int * pint;

void f1(pint & j)

所以這是乙個pint型別的引用,也就是int * 型別的引用。

因為是引用,所以最後j指向了零時變數l的位址。

零時變數,尤其是整型,編譯其一般都把它放在暫存器裡。

所以隨著暫存器中值的變化,輸出的值會不同。

c 臨時變數

有時候,在求表示式的期間,編譯器必須建立臨時變數 temporary object 像其它任何物件一樣,它們需要儲存空間,並且必須能夠構造和銷毀。需要注意的是,編譯器建立的這個臨時變數為常量.thinking in c 看下面 class a a generatea intmain 在a a gen...

C 引用與臨時變數

引用是c 的一種復合型別,是已定義的變數的別名,與原變數在同乙個記憶體位址。引用常常作為函式的形參,此時函式將使用原始資料 而不是原始資料的副本 使用引用時需要注意以下兩點 必須在宣告引用的時候就進行初始化,否則編譯會報錯。一旦成為某個變數的引用,則將一直效忠於它。下面通過乙個例子,來看看引用在函式...

C 常量引用與臨時變數

由 練習7.49 b 產生出來的小問題。總結 1.不要對臨時變數進行改變。要傳遞臨時變數,得用常量引用。2.當引用不需要更改時,用const引用。問題 struct sales data sales data combine sales data sales data sales data comb...