1. 程式人生 > >[C++]23.神祕的臨時物件

[C++]23.神祕的臨時物件

一、有趣的問題

輸出結果:(是一個隨機值)

發生了什麼:

思考

答案

程式碼段Test(0)產生臨時物件:

    Test() {
        Test(0); //想直接呼叫引數建構函式;此時產生臨時物件
		         //等價於 Test(0) 不存在
    }

新增init()函式避免產生鄰時物件:

class Test {
    int mi;
    
    void init(int i) //為了不讓程式產生臨時物件,
    {                //實際工程中新增init()函式
        mi = i;
    }
public:
    Test
(int i) { init(i); } Test() { init(0); } void print() { printf("mi = %d\n", mi); } };
## 二、現代編譯器的行為:

三、程式設計實驗:神祕的臨時物件

#include <stdio.h>

class Test
{
    int mi;
public:
    Test(int i)
    {
        printf("Test(int i) : %d\n", i);
        mi = i;
} Test(const Test& t) { printf("Test(const Test& t) : %d\n", t.mi); mi = t.mi; } Test() { printf("Test()\n"); mi = 0; } int print() { printf("mi = %d\n", mi); } ~Test() { printf("~Test()\n"); }
}; Test func() { return Test(20); } int main() { Test t = Test(10); // ==> Test t = 10; //1.生成臨時物件 2.用臨時物件初始化化 t 物件 //發現:編譯器沒有呼叫拷貝建構函式 Test tt = func(); // 等價於:==> Test tt = Test(20); ==> Test tt = 20; t.print(); tt.print(); //臨時物件會降低效率 return 0; }
##四、小結: