C 23 神秘的臨時物件

2021-09-13 02:18:28 字數 1355 閱讀 3858

class test

test()

void print()

};

int main()

#include class test

test()

void print()

};int main()

輸出:

mi = 11341812

執行結果

究竟哪個地方出了問題?

定義私有的的可復用普通成員函式

#include class test

public:

test(int i)

test()

void print()

};int main()

輸出:

mi = 0

#include class test

test(const test& t)

test()

void print()

~test()

};test func()

int main()

輸出:【g++】

test(int i) : 10

test(int i) : 20

mi = 10

mi = 20

~test()

~test()

分析:1. test t = test(10); 為什麼拷貝建構函式沒有被呼叫呢?

在古老的編譯器中,會發生如下過程:

a. 生成臨時物件(呼叫建構函式)

b. 用臨時物件初始化 t (呼叫拷貝建構函式)

2. test tt = func(); 為什麼拷貝建構函式沒有被呼叫呢?

在古老的編譯器中,會發生如下過程:

a. 生成臨時物件(呼叫建構函式)

b. 返回臨時物件,初始化 tt (呼叫拷貝建構函式)

使用臨時物件初始化物件,將額外產生一次拷貝函式的呼叫,c++ 編譯器為了避免效能損失,在不影響最終執行結果的前提下,盡力減少臨時物件的產生。

test t = test(10); ==> test t = 10;

test tt = func(); ==> test tt = test(20); ==> test tt = 20;

23 神秘的臨時物件

注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 4.4.5 一 有趣的問題 1 下面的程式輸出什麼?為什麼?例項分析 23 1.cpp include class test test void print int main 操作 1 g...

C 中神秘的臨時物件分析

include class test test void print intmain 1 程式意圖 在test 中以0作為引數呼叫test int i 將成員變數mi的值初始化設定為零 2 執行結果 成員變數mi的值為隨機值1 直接呼叫建構函式將產生乙個臨時物件 2 臨時物件的生命週期只有一條語句的...

物件和類 神秘的臨時物件

本文參照於狄泰軟體學院,唐佐林老師的 c 深度剖析教程 通過函式傳遞物件產生的臨時物件 c 中有這樣一種物件 它在 中看不到,但是確實存在。它就是臨時物件!臨時物件是由編譯器定義的乙個沒有命名的非堆物件。主要是為了提高程式的效能以及效率,因為臨時物件的構造與析構對系統效能而言絕不是微小的影響,所以我...