为什么我的 C++ 程序的复制构造函数被调用了两次?
Why is my C++ program's copy constructor called twice?
我不明白为什么我的输出以“ACCB..”开头 - 我的期望是“ACB..”
为什么class A
的拷贝构造函数被调用了两次?
#include <iostream>
using namespace std;
class A
{
int x, y, z;
public:
A(int x, int y, int z) :x(x), y(y), z(z) { cout << "A"; }
A(A& a) :x(a.x), y(a.y), z(a.z) { cout << "C"; }
void sh() { cout << x << y << z; }
};
class B
{
A a;
int q, r;
public:
B(A x, int y, int z) : a(x), q(y), r(z) { cout << "B"; }
void sh() { a.sh(); cout << q << r; }
};
int main()
{
A i(9, 7, 4);
B b(i, 3, 7);
b.sh();
}
你的复制构造函数被调用了 2 次,因为你正在制作 2 个副本。 1 由编译器隐式,而 1 在您自己的代码中显式。
在您的 B
构造函数中,它的 x
参数被 按值 传递。这是在将 main()
中的 i
分配给 x
时进行的隐式复制。然后,当 x
传递给 B
.
的 a
成员的复制构造函数时,会进行显式复制
您可以通过更改要传递的 参数 来消除隐式复制。
此外,您的 A
复制构造函数应声明为 A(const A& a)
。
#include <iostream>
using namespace std;
class A
{
int x, y, z;
public:
A(int x, int y, int z) :x(x), y(y), z(z) { cout << "A"; }
A(const A& a) :x(a.x), y(a.y), z(a.z) { cout << "C"; }
void sh() { cout << x << y << z; }
};
class B {
A a;
int q, r;
public:
B(const A& x, int y, int z) : a(x), q(y), r(z) { cout << "B"; }
void sh() { a.sh(); cout << q << r; }
};
int main()
{
A i(9, 7, 4);
B b(i, 3, 7);
b.sh();
}
Why copy constructor of class A is called twice?
因为您的 B
构造函数采用第一个参数(class A
的 对象)by value - 因此制作了 i
的副本,然后将其传递给构造函数。
为防止这种情况,将 B
构造函数的第一个参数声明为 reference(与 A
复制构造函数本身一样):
B(A& x, int y, int z) : a(x), q(y), r(z)
{
cout << "B";
}
我不明白为什么我的输出以“ACCB..”开头 - 我的期望是“ACB..”
为什么class A
的拷贝构造函数被调用了两次?
#include <iostream>
using namespace std;
class A
{
int x, y, z;
public:
A(int x, int y, int z) :x(x), y(y), z(z) { cout << "A"; }
A(A& a) :x(a.x), y(a.y), z(a.z) { cout << "C"; }
void sh() { cout << x << y << z; }
};
class B
{
A a;
int q, r;
public:
B(A x, int y, int z) : a(x), q(y), r(z) { cout << "B"; }
void sh() { a.sh(); cout << q << r; }
};
int main()
{
A i(9, 7, 4);
B b(i, 3, 7);
b.sh();
}
你的复制构造函数被调用了 2 次,因为你正在制作 2 个副本。 1 由编译器隐式,而 1 在您自己的代码中显式。
在您的 B
构造函数中,它的 x
参数被 按值 传递。这是在将 main()
中的 i
分配给 x
时进行的隐式复制。然后,当 x
传递给 B
.
a
成员的复制构造函数时,会进行显式复制
您可以通过更改要传递的 参数 来消除隐式复制。
此外,您的 A
复制构造函数应声明为 A(const A& a)
。
#include <iostream>
using namespace std;
class A
{
int x, y, z;
public:
A(int x, int y, int z) :x(x), y(y), z(z) { cout << "A"; }
A(const A& a) :x(a.x), y(a.y), z(a.z) { cout << "C"; }
void sh() { cout << x << y << z; }
};
class B {
A a;
int q, r;
public:
B(const A& x, int y, int z) : a(x), q(y), r(z) { cout << "B"; }
void sh() { a.sh(); cout << q << r; }
};
int main()
{
A i(9, 7, 4);
B b(i, 3, 7);
b.sh();
}
Why copy constructor of class A is called twice?
因为您的 B
构造函数采用第一个参数(class A
的 对象)by value - 因此制作了 i
的副本,然后将其传递给构造函数。
为防止这种情况,将 B
构造函数的第一个参数声明为 reference(与 A
复制构造函数本身一样):
B(A& x, int y, int z) : a(x), q(y), r(z)
{
cout << "B";
}