0

我找到了这个示例面试问题,并希望得到一些帮助来理解它:

#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 的复制构造函数。复制构造函数不用于 &d = c 因为它只引用 c 对吗?还有一件事我不明白的是,如果复制构造函数需要引用,那么如何将对象传递给它而不是对对象的引用?带指针之后的部分让我很困惑。有人可以提供一些见解吗?

谢谢!

4

2 回答 2

0

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

是的。d 成为 c 的别名。

还有一件事我不明白的是,如果复制构造函数需要引用,那么如何将对象传递给它而不是对对象的引用?

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

带指针之后的部分让我很困惑。有人可以提供一些见解吗?

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

f(3) 变得有趣。它构造一个用 3 初始化的临时 A 来绑定到 a1。a2 得到一个临时默认构造的 A。在 f(3) 完成后,这两个临时对象被销毁。

函数结束,A 的剩余实例被销毁。

于 2013-02-28T02:24:24.237 回答
-1

在面试之外,您可以将此代码粘贴到 IDE 中,并使用调试器逐步完成。

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

于 2013-02-28T01:04:33.830 回答