首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当对象包含在c++中的另一个对象中时,复制构造函数会被调用两次?

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

Stack Overflow用户
提问于 2017-01-05 16:15:08
回答 1查看 59关注 0票数 0
代码语言:javascript
复制
//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的exist对象初始化,所以V4的构造函数将调用V3的复制构造函数,我认为复制构造函数将被调用一次,但是结果显示它被称为tiwce,为什么是它?

编译代码:

代码语言:javascript
复制
g++ V4.cpp -o V4 -Wall

然后跑:

代码语言:javascript
复制
./V4

其结果是:

代码语言:javascript
复制
V3(double, double, double)
V3(const V3 &)
V3(const V3 &)
V4(V3, double)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-05 16:16:45

V3 a的构造函数中按值取V4,从而产生一个额外的不必要的副本。

代码语言:javascript
复制
class V4 {
private:
    V3 xyz;
    double time;
public:
    V4(const V3& a, double t): xyz(a), time(t) {
//     ^^^^^^^^^^^
        cout << "V4(V3, double)" << endl;
    }
};

wandbox example

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41489697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档