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...