C++中的臨時變量

臨時變量


首先看一段代碼:

#include <stdio.h>

class Test {
    int mi;
public:
    Test(int i) {
        mi = i;
    }
    Test() {
        Test(0);
    }
    void print() {
        printf("mi = %d\n", mi);
    }
};


int main()
{
    Test t;
    
    t.print();

    return 0;
}

這個時候可以想一想會輸出什么? mi的值是什么?
運行結果如下:

mi = 515686454
  • 程序意圖:

    • 在Test()中以0作為參數調用Test(int i)
    • 將成員變量mi的初始值設置為0
  • 運行結果:

    • 成員變量mi的值為隨機值
  • 答案:

    • 直接調用構造函數將產生一個臨時對象
    • 臨時對象的聲明周期只有一條語句的時間
    • 臨時對象的作用于只在一條語句中
    • 臨時對象是C++中值得警惕的灰色地帶

那說到這里,如何避開這個陷阱,又能解決剛才的問題呢?

#include <stdio.h>

class Test {
    int mi;
    
    void init(int i)
    {
        mi = i;
    }
public:
    Test(int i) {
        init(i);
    }
    //在這里調用成員函數初始化,不能直接調用構造函數
    Test() {
        init(0);
    }
    void print() {
        printf("mi = %d\n", mi);
    }
};


int main()
{
    Test t;
    
    t.print();

    return 0;
}

小結:

  • 直接調用構造函數將產生一個臨時對象
  • 臨時對象是性能的瓶頸,也是bug的來源之一
  • 現代c++編譯器會盡力避開臨時對象
  • 實際工程開發中需要人為的避開臨時對象
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 你只是不愿相信,別人也知道努力這回事
    SpeedForce閱讀 251評論 0 0
  • 悅己第三課拆解的是《金錢的靈魂》這本書。這本書不是一本理財書籍,而是從道的層面告訴我們怎么去打通和金錢的關系。 娟...
    元氣滿滿的zm閱讀 561評論 0 2
  • 今天的主題是一周所學,采用手帳的形式,因為群里每天的點評都有記錄到簡書,再采用結構思考力的“論證類比”,把所有評價...
    wendyy閱讀 196評論 0 0
  • 遇到外省市的朋友,他們問你來自哪,只要說來自內蒙古就可以了,他們不在意你來自內蒙古的包頭還是呼和浩特。如果在國外遇...
    應栗閱讀 127評論 0 0