C 臨時匿名物件

2022-05-23 14:42:13 字數 1923 閱讀 7801

匿名物件:臨時的物件,一般都是在構造完就被釋放掉了(有特殊情況,返回值優化)

1. 返回值優化:若是函式返回的匿名物件返回時候有同型別的新物件接上,則該匿名物件被轉化為新物件。

1 #include "

iostream"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

view code

//

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的匿名物件

2. 沒有物件名:普通情況,構造完成之後就直接被析構

1 #include "

iostream"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

view code

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 為什麼研究臨時物件?主要是為了提高程式的效能以及效率,因為臨時物件的構造與析構對系統效能而言絕不是微小的影響,所以我們應該去了解它們,知道它們如何造成,從而盡可能...