匿名物件:臨時的物件,一般都是在構造完就被釋放掉了(有特殊情況,返回值優化)
1. 返回值優化:若是函式返回的匿名物件返回時候有同型別的新物件接上,則該匿名物件被轉化為新物件。
1 #include "view codeiostream"2
using
namespace
std;34
classa5
13 a (a &obj)
1417 ~a()
1821
protected:22
private:23
inta1;
24int
b1;25
};26
27//
函式返回值產生匿名物件
28a g()
2933
//測試一: 匿名物件用來初始化乙個新物件。
34void
test1()
3538
//測試二: 用等號初始化乙個新物件
39void
test2()
4044
45int
main()
46
//2. 沒有物件名:普通情況,構造完成之後就直接被析構test1結果:呼叫了兩次建構函式,兩次析構函式
construct function called!構造a2
copy_constructor function called!構造匿名a2的匿名物件
objext destory function called!析構區域性變數a2
objext destory function called!析構a1(其實就是a2的匿名物件)
//test2結果:呼叫了三次建構函式三次析構函式
construct function called!構造a3
construct function called!構造a2
copy_constructor function called!構造匿名a2的匿名物件
objext destory function called!析構區域性變數a2
objext destory function called!析構a2的匿名物件
1 #include "view codeiostream"2
using
namespace
std;34
classa5
13 a (a &obj)
1417 ~a()
1821
void
printf()
2226
protected:27
private:28
inta1;
29int
b1;30
};31
32int
main()
33
3. 需要注意的點:
1. 所有形參都提供了預設的實參的建構函式也定義了預設建構函式,而這樣的建構函式形參列表是有形參的(有參建構函式的形參有初始值的話,就相當於寫了預設建構函式)
2. 匿名物件是否被析構看返回值是否有物件來接上
3. 拷貝建構函式的三種應用場景:
<1> a1 = a2 (區分兩種不同的情況: a aa; a bb = aa;會 //bb = aa; 不會 ):乙個物件初始化另乙個物件時
<2> func(a a1):當物件作為函式引數時
<3> a a2 = func():當函式返回值為物件時(涉及到匿名物件的問題)
4. 特別注意:等號操作和物件的初始化是兩個不同的概念
匿名物件?臨時物件?
關於匿名物件與臨時物件,這個概念不是絕對的,概念的區分往往十分拗口難記。要根據作用域,生存時間和用法來來決定 工作多年這些拗口的概念我從來沒有真的記住過,也沒有乙個部落格講清楚他們的區別。這裡我們參考 effective c 中得稱謂,稱之為區域性物件。但是區域性也是有範圍得。下面論證。1無名則無份...
C 臨時物件
臨時物件的產生 1.用建構函式作為隱式型別轉換函式時。2.建立乙個沒有名字的物件時。直接寫下 ctempobj 輸出 init obj exit obj 不單調用了建構函式,還呼叫了析構函式.既然是物件也可以這樣使用 ctempobj fun 不過這樣使用可要小心了 new ctempobj fun...
C 臨時物件
c 中有這樣一種物件 它在 中看不到,但是確實存在。它就是臨時物件 由編譯器定義的乙個沒有命名的非堆物件 non heap object 為什麼研究臨時物件?主要是為了提高程式的效能以及效率,因為臨時物件的構造與析構對系統效能而言絕不是微小的影響,所以我們應該去了解它們,知道它們如何造成,從而盡可能...