带引用和指针的C ++构造函数?

时间:2013-02-28 00:49:21

标签: c++ pointers reference constructor copy-constructor

我找到了这个示例面试问题,希望能帮助理解它:

#include <iostream>

class A
{
public:
    A(int n = 0)
        : m_n(n)
    {
        ++m_ctor1_calls;
    }

    A(const A& a)
        : m_n(a.m_n)
    {
        ++m_copy_ctor_calls;
    }

public:
    static int m_ctor1_calls;
    static int m_copy_ctor_calls;

private:
    int m_n;
};

int A::m_ctor1_calls = 0;
int A::m_copy_ctor_calls = 0;

void f(const A &a1, const A &a2 = A())
{
}

int main()
{
    A a(2), b = 5;
    const A c(a), &d = c, e = b;
    std::cout << A::m_ctor1_calls << A::m_copy_ctor_calls;
    b = d;
    A *p = new A(c), *q = &a;
    std::cout << A::m_copy_ctor_calls;
    delete p;
    f(3);
    std::cout << A::m_ctor1_calls << A::m_copy_ctor_calls << std::endl;

    return 0;
}

我理解它的方式,main的第一行创建了两个新对象,导致对构造函数的2次调用。在第二行中,我看到他们使用c(a)和e = b的复制构造函数。复制构造函数不用于&amp; d = c,因为它只引用c是对的吗?另外一件事我不明白,如果复制构造函数需要引用,为什么一个对象被传递到它而不是对象的引用?指针之后的部分对我来说真的很混乱。有人可以提供一些见解吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

  

复制构造函数不用于&amp; d = c,因为它只是   引用c是对的吗?

是。 d成为c的别名。

  

另外一件我不明白的是,如果是复制构造函数   需要一个引用,一个对象是如何传递给它的   而不是对象的引用?

传递给引用函数的对象会自动“转换”为引用。该参数现在是传入对象的别名。

  

指针之后的部分对我来说真的很混乱。有人可以   提供一些见解?

指向从c复制的新分配的A对象。 q指向a。 (1个拷贝构造函数)。然后p被删除。

f(3)变得有趣。它构造了一个用3初始化的临时A来绑定到a1。 a2获得临时默认构造A.在f(3)结束后,这两个临时值被销毁。

功能结束,A的剩余实例被销毁。

答案 1 :(得分:-2)

在访谈之外,您可以将此代码放在IDE中,然后使用调试器逐步完成。

如果您想知道,这是输出(添加了空格): 2 2 3 4 3