为什么在 C++ 中,当对象包含在另一个对象中时,复制构造函数被调用两次

why the copy constructor is called twice when the object is contained in another object in c++?

本文关键字:调用 两次 构造函数 一个对象 对象 C++ 包含 为什么 复制      更新时间:2023-10-16
//V4.cpp
#include <iostream>
using namespace std;
class V3 {
private:
    double x, y, z;
public:
    V3(double a, double b, double c): x(a), y(b), z(c) {
        cout << "V3(double, double, double)" << endl; 
    }
    V3(const V3 &a): x(a.x), y(a.y), z(a.z) {
        cout << "V3(const V3 &)" << endl;
    }
};
class V4 {
private:
    V3 xyz;
    double time;
public:
    V4(V3 a, double t): xyz(a), time(t) {
        cout << "V4(V3, double)" << endl;
    }
};
int main(void)
{
    V3 xyz(1.0, 2.0, 3.0);
    double t(4.0);
    V4 xyzt(xyz, t);
    return 0;
}
类 V4 包含另一个类 V3,而 V4

的对象是由 V3 的一个存在对象初始化的,所以 V4 的构造函数会调用 V3 的复制构造函数,我认为复制构造函数会被调用一次,但结果显示它叫 tiwce,为什么呢?

编译代码:

g++ V4.cpp -o V4 -Wall

并运行:

./V4

结果是:

V3(double, double, double)
V3(const V3 &)
V3(const V3 &)
V4(V3, double)

所以看看结果,为什么 V3 复制构造函数被调用两次?我的操作系统是 Lubuntu16.04,g++ 是 5.4.0

你在V4的构造函数中按值获取V3 a,导致额外的不必要的副本。你应该通过const&来接受它:

class V4 {
private:
    V3 xyz;
    double time;
public:
    V4(const V3& a, double t): xyz(a), time(t) {
//     ^^^^^^^^^^^
        cout << "V4(V3, double)" << endl;
    }
};

魔杖盒示例