本文參照於狄泰軟體學院,唐佐林老師的——《c++深度剖析教程》
通過函式傳遞物件產生的臨時物件
c++中有這樣一種物件:它在**中看不到,但是確實存在。它就是臨時物件!主要是為了提高程式的效能以及效率,因為臨時物件的構造與析構對系統效能而言絕不是微小的影響,所以我們應該去了解它們,知道它們如何造成,從而盡可能去避免它們。臨時物件是由編譯器定義的乙個沒有命名的非堆物件。
因為在專案中,乙個類中所包含的成員變數和成員函式是很龐大的,因此對應的建構函式需要初始化大量的資料,耗費cpu的資源。如果程式中存在大量臨時變數的生成就意味著會呼叫多次建構函式,影響程式的效能以及效率。
示例**:有趣的問題
#include
#include
using
namespace
std;
class test
test()
void print()
~test()
};int main()
程式意圖:
1. 在test() 中以0作為引數呼叫 test(int i)
2. 將成員變數mi的初始值設定為0
輸出結果:看到這個輸出,我們有幾個疑問?test()
test(int i)
~test()
mi = 49
~test()
1. 成員變數mi的值為隨機值,究竟哪個地方出了問題?
2. 建構函式是否可以直接呼叫?直接呼叫建構函式的行為是什麼?
3. 是否可以在建構函式中呼叫建構函式?
4. 直接呼叫建構函式的行為是什麼?
分析:
1. 輸出兩次析構函式,意味著產生了兩個物件。
輸出結果說明了直接呼叫建構函式會產生乙個不知名的臨時物件。
2. 直接呼叫建構函式,會產生乙個臨時物件,臨時物件的生命週期只有一句語句的時間。
生命週期為一條語句,這就說明了臨時物件的作用域也只有一句。編譯器也會自動銷毀這個臨時物件,所以沒有為mi初始化成功。
3. 臨時物件是c++中值得警惕的灰色地帶
防止產生臨時物件的方法
問題:如何解決直接呼叫建構函式產生的臨時物件?不要直接呼叫建構函式,編寫乙個初始化函式再進行呼叫。
#include
#include
using
namespace
std;
class test
public:
test()
void print()
~test()
};int main()
還有什麼情況可能產生臨時物件呢?函式傳遞物件。
示例**:通過函式傳遞物件
#include
#include
using
namespace
std;
class people
people()
people(const people& p)
~people()
private:
const
char *name;
int age;
};void swap(people p1, people p2)
int main(int argc, char *argv)
輸出結果:分析:people(const char* n, int a) : name(n), age(a)
people(const char* n, int a) : name(n), age(a)
people(const people& p)
people(const people& p)
temporary constructor
~people()
~people()
swap(p1, p2)
~people()
~people()
1. 根據函式呼叫的過程其實我們也可以知道,實際上實參會拷貝乙份給函式形參。所以會呼叫拷貝建構函式。
拷貝建構函式也只有一句語句的生命週期。
使用引用解決函式引數產生的臨時物件
問題:如何解決函式引數傳遞產生臨時物件的這個問題?我們可以使用引用實參來達到目的
void swap(people &p1, people &p2)
23 神秘的臨時物件
注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 4.4.5 一 有趣的問題 1 下面的程式輸出什麼?為什麼?例項分析 23 1.cpp include class test test void print int main 操作 1 g...
C 23 神秘的臨時物件
class test test void print int main include class test test void print int main 輸出 mi 11341812 執行結果 究竟哪個地方出了問題?定義私有的的可復用普通成員函式 include class test publ...
C 中神秘的臨時物件分析
include class test test void print intmain 1 程式意圖 在test 中以0作為引數呼叫test int i 將成員變數mi的值初始化設定為零 2 執行結果 成員變數mi的值為隨機值1 直接呼叫建構函式將產生乙個臨時物件 2 臨時物件的生命週期只有一條語句的...