下面的代码介绍了一个C类。该类有构造函数,复制构造函数,operator =和一个成员。如何在函数main()中获取由C(2)创建的对象的地址?
#include <iostream>
class C
{
public:
int a;
C(const C &other)
{
std::cout << "Copy Constructor:" << a << std::endl;
}
C(int a)
{
this->a = a;
std::cout << "Constructor:" << a << std::endl;
}
C &operator=(const C &other)
{
std::cout << "operator=:this.a = " << a << " | other.a = " << other.a << std::endl;
a = other.a;
return *this;
}
~C()
{
std::cout << "Destructor:" << a << std::endl;
}
};
int main()
{
C a(1);
a = C(2);
}
答案 0 :(得分:4)
你做不到。你被禁止接受临时的地址。它们会很快超出范围,留下无效的地址。
答案 1 :(得分:2)
在对象超出范围之前,您可以使用辅助函数在某处写入地址:
template <typename T>
T const & store_possibly_invalid_address(T const & t, T const *& p)
{
p = &t;
return t;
}
int main()
{
C a(1);
C const * invalid_address;
a = store_possibly_invalid_address(C(2), invalid_address);
// The temporary is out of scope, but you can see where it was.
// Don't dereference the pointer.
}
这可能具有教育意义,可以发现编译器选择放置临时工具的位置。但是,它在任何实际代码中都没有用处。
答案 2 :(得分:0)
唯一的方法是在课堂上进行一些合作;该
构造函数具有地址(this
指针),并且可以放置它
在某个地方你可以在以后找到它。我建议反对,
但是,由于物体的寿命不足以让你做很多事情
它。 (另一方面,它有时对调试输出很有用
它)。