2014-01-14 90 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块运行时退出。

相关问题