物件和類 神秘的臨時物件

2021-08-20 08:15:36 字數 2545 閱讀 2905

本文參照於狄泰軟體學院,唐佐林老師的——《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 臨時物件的生命週期只有一條語句的...