如何获取初始化程序的地址?

时间:2011-11-17 18:05:22

标签: c++

下面的代码介绍了一个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);
    }

3 个答案:

答案 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指针),并且可以放置它 在某个地方你可以在以后找到它。我建议反对, 但是,由于物体的寿命不足以让你做很多事情 它。 (另一方面,它有时对调试输出很有用 它)。