深入理解C 中的物件和物件引用

2021-06-26 20:57:34 字數 2310 閱讀 6518

有言在先: 返回區域性物件和引用, 就像返回區域性變數的位址一樣, 非常非常危險, 要避免使用

先來看乙個入門級的程式:

#include using namespace std;

class a

};void fun(a a)

int main()

結果為:

a constructor

---編譯器自動產生的拷貝建構函式得到了呼叫。

#include using namespace std;

class a

};void fun(a a)

int main()

結果為:

---a deconstructor

a deconstructor

注意, 有兩個物件, 所以有兩次析構。

在第乙個程式中, 我們來顯式定義一下拷貝建構函式:

#include using namespace std;

class a

a(a& a) };

void fun(a a)

int main()

結果為:

a constructor

---copy constructor

可見, 拷貝建構函式確實被呼叫了

我們來繼續看:

#include using namespace std;

class a

a(a& a)

~a() };

void fun(a &a)

int main()

結果為:

a constructor

---a deconstructor

可見, 沒有物件的拷貝。 這樣, 在fun函式中, 就省略了拷貝的過程, 而是直接引用a. 節省時間, 節省空間, 真好。

#include using namespace std;

class a

a(a& a)

~a() };

a fun()

int main()

結果為:

a constructor

---a constructor

------

copy constructor

a deconstructor

a deconstructor

a deconstructor

繼續看:

#include using namespace std;

class a

a(a& a)

~a() };

a& fun()

int main()

結果為:

a constructor

---a constructor

------

a deconstructor

a deconstructor

看吧, 在函式返回的時候, 是返回引用的, 這樣, 又少了一次拷貝。

繼續看乙個稍微複雜一點的:

#include using namespace std;

class a

a(a& a)

~a() };

a fun(a a)

int main()

結果:

a constructor

---copy constructor

a constructor

------

copy constructor

a deconstructor

a deconstructor

a deconstructor

a deconstructor

對上面程式進行優化:

#include using namespace std;

class a

a(a& a)

~a() };

a& fun(a& a)

int main()

結果為:

a constructor

---a constructor

------

a deconstructor

a deconstructor

可見, 物件引用在c++中確實有很大的好處。比傳物件快捷高效, 比指標更優美。

深入理解js物件的引用

基本型別 空值 null 未定義 undefined 布林值 boolean 數字 number 字串 string 符號 symbol,es6 中新增 引用型別 物件 object const a 哈哈 const b 哈哈 console.log a b true const c const d...

深入理解C 物件模型1 關於物件

c 物件模型可以從兩個層面來解釋 本文主要從第二個方面來進行剖析。注 c 物件模型的底層實現機制並未標準化,不同的編譯器對物件模型的底層實現機制可能有所差異,但其目標都是優化物件空間和時間的訪問效率,並支援c 語言說規定的虛函式,虛基類等機制。相比於c,c 在記憶體布局以及訪問時間 效率 上的主要的...

深入理解PHP物件賦值

1 2 深入理解php物件賦值 3echo 45 obj new stdclass 6 obj name pig 7var dump obj object stdclass 1 1 89 copy obj obj copy都是new stdclass返回的同乙個識別符號的拷貝 10var dump ...