このインタビューの質問の例を見つけました。それを理解するための助けが必要です。
#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 つの新しいオブジェクトが作成され、コンストラクターが 2 回呼び出されます。2 行目では、c(a) と e = b に対してコピー コンストラクターを使用していることがわかります。&d = c は c を参照しているだけなので、コピー コンストラクターは使用されません。また、私が理解していないことの1つは、コピーコンストラクターが参照を必要とする場合、オブジェクトへの参照ではなくオブジェクトが渡されるのはなぜですか? ポインターの後の部分は、私にとって本当に紛らわしいです。誰かが洞察を提供できますか?
ありがとう!