我找到了这个示例面试问题,并希望得到一些帮助来理解它:
#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 对吗?还有一件事我不明白的是,如果复制构造函数需要引用,那么如何将对象传递给它而不是对对象的引用?带指针之后的部分让我很困惑。有人可以提供一些见解吗?
谢谢!