我找到了这个示例面试问题,希望能帮助理解它:
#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是对的吗?另外一件事我不明白,如果复制构造函数需要引用,为什么一个对象被传递到它而不是对象的引用?指针之后的部分对我来说真的很混乱。有人可以提供一些见解吗?
谢谢!
答案 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