2014-01-14 32 views
4

這裏的一些C++代碼:此代碼行爲是否定義良好?

#include <iostream> 

class A 
{ 
    int x; 
    int y; 
    double v; 

    public: 
     A(int x, int y) 
      :x(x),y(y) 
     { 
      std::cerr << "A("<<x<<","<<y<<")\n"; 
     } 
     ~A() 
     { 
      std::cerr << "~A()\n"; 
     } 
     operator double*() 
     { 
      v=1.5*x+y; 
      return &v; 
     } 
}; 

void f(double* val) 
{ 
    std::cerr << "f("<<*val<<")\n"; 
    *val=0.3; 
} 

int main() 
{ 
    f(A(3,5)); 
} 

我得到以下的輸出:

A(3,5)
F(9.5)
〜A()

即,

也就是說因爲我希望它能工作。但我不確定在f返回後是否必須調用A的析構函數。它有保證嗎?在f的電話中,operator double*()返回的指針可以以某種方式變得無效?

回答

3

函數的參數在函數被調用之前被評估,並且臨時對象將活到它們所在的完整表達式的末尾。所以是的,A的實例將活到剛剛超過調用f

4

你正在聲明一個A對象作爲f的一個實際參數,當你這麼做時,對於所有的效果,新對象就像是一個f的局部變量so〜A保證在f執行結束時被調用。

如果f返回由operator double*()返回的地址,並在f返回後使用,您將訪問無效內存。避免這種情況的一種方法是使靜態double v,但你必須考慮,在你的代碼中,A類創建的對象只在f塊運行時退出。

相關問題