虽然我提供了移动构造函数,但调用了复制构造函数

发布于 2025-01-28 03:02:33 字数 2767 浏览 1 评论 0原文

我已经实现了复制构造函数和移动构造函数,我学到的是该程序必须使用移动构造函数而不是复制构造函数。

class Move
{
private:
    int *data; // raw  pointer

public:
    Move(int);                // constructor
    Move(const Move &source); // copy constructor
    Move(Move &&source);      // Move Constructor
    ~Move();
};

Move::Move(int d)
{
    data = new int;
    *data = d;
    cout << "Constructor for: " << d << endl;
}

Move::Move(const Move &source)
    : Move(*source.data)
{
    cout << "Copy constructor -deep copy for: " << *data << endl;
}

Move::Move(Move &&source)
    : data{source.data}
{
    source.data = nullptr;
    cout << "Move constructor -Moving resource: " << *data << endl;
}

Move::~Move()
{
    if (data != nullptr)
    {
        cout << "Destructor freeing data for : " << *data << endl;
    }
    else
    {
        cout << "Destructor freeing data for nullptr" << endl;
    }
    delete data;
}

//driving function
int main()
{

    vector<Move> vec;
    vec.push_back(Move{10});
    vec.push_back(Move{20});
    vec.push_back(Move{30});
    vec.push_back(Move{40});
    vec.push_back(Move{50});
    vec.push_back(Move{60});
    vec.push_back(Move{70});

    return 0;
}

输出:

构造函数:10

MOVE构造函数 - 移动资源:10

驱动器释放NULLPTR

构造函数的释放数据:20

MOVE构造函数 - 移动资源:20

构造函数:10

copy构造函数:10 cople构造

函数 - for:10 destructor for:10 destructor for for:10

dostructor for dostructor freetructor fireing freetaring数据对于NULLPTR

构造函数:30

MOVE构造函数 - 移动资源:30

构造函数

:10复制

构造函数-Deep -Deep copy for:10构造函数:20

copy构造函数:20

destructor for:20 destructor freeing数据的数据:10 destructor foreforing for:20

for:20 destructor for:20

destructor:20 destructor 释放NULLPTR构造函数的数据

:40

MOVE构造函数 - 移动资源:40

的释放数据

destructor for NullPtr构造函数

:50 MOVE构造函数 - 移动资源:50

构造函数:10

copy构造函数:10 copy构造函数-10构造函数:10

copy构造函数:20

复制构造函数:深副本:20

构造函数:30

复制构造函数-DEEP副本:30

构造函数:40

复制构造函数-Deep copy for:40

destructructor freeder数据的数据:10

destructructor free -freening for:20

destructor free -deStructor freeder free数据:30

destructructor notsructor noterricing数据for:40

destructor for NullPTR构造函数的释放数据

:60

移动构造函数 - 移动资源:60

NULLPTR

构造函数的60 nullptr构造函数的免费数据:70

移动构造函数 - 移动资源:70

驱动器释放

数据,用于NULLPTR destructor foreator for:10

deStructor for: 10 :20

驱动器释放数据:30

DESTRUCTOR免费数据:40

DESTRUCTOR FREETER数据的数据:50

DESTRUCTOR FREETRUCTOR数据:60

DESTRUCTRUCTOR免费数据:70

I have implemented both copy constructor and move constructor and what i learned was the program must use Move constructor instead of copy constructor .

class Move
{
private:
    int *data; // raw  pointer

public:
    Move(int);                // constructor
    Move(const Move &source); // copy constructor
    Move(Move &&source);      // Move Constructor
    ~Move();
};

Move::Move(int d)
{
    data = new int;
    *data = d;
    cout << "Constructor for: " << d << endl;
}

Move::Move(const Move &source)
    : Move(*source.data)
{
    cout << "Copy constructor -deep copy for: " << *data << endl;
}

Move::Move(Move &&source)
    : data{source.data}
{
    source.data = nullptr;
    cout << "Move constructor -Moving resource: " << *data << endl;
}

Move::~Move()
{
    if (data != nullptr)
    {
        cout << "Destructor freeing data for : " << *data << endl;
    }
    else
    {
        cout << "Destructor freeing data for nullptr" << endl;
    }
    delete data;
}

//driving function
int main()
{

    vector<Move> vec;
    vec.push_back(Move{10});
    vec.push_back(Move{20});
    vec.push_back(Move{30});
    vec.push_back(Move{40});
    vec.push_back(Move{50});
    vec.push_back(Move{60});
    vec.push_back(Move{70});

    return 0;
}

Output:

Constructor for: 10

Move constructor -Moving resource: 10

Destructor freeing data for nullptr

Constructor for: 20

Move constructor -Moving resource: 20

Constructor for: 10

Copy constructor -deep copy for: 10

Destructor freeing data for : 10

Destructor freeing data for nullptr

Constructor for: 30

Move constructor -Moving resource: 30

Constructor for: 10

Copy constructor -deep copy for: 10

Constructor for: 20

Copy constructor -deep copy for: 20

Destructor freeing data for : 10

Destructor freeing data for : 20

Destructor freeing data for nullptr

Constructor for: 40

Move constructor -Moving resource: 40

Destructor freeing data for nullptr

Constructor for: 50

Move constructor -Moving resource: 50

Constructor for: 10

Copy constructor -deep copy for: 10

Constructor for: 20

Copy constructor -deep copy for: 20

Constructor for: 30

Copy constructor -deep copy for: 30

Constructor for: 40

Copy constructor -deep copy for: 40

Destructor freeing data for : 10

Destructor freeing data for : 20

Destructor freeing data for : 30

Destructor freeing data for : 40

Destructor freeing data for nullptr

Constructor for: 60

Move constructor -Moving resource: 60

Destructor freeing data for nullptr

Constructor for: 70

Move constructor -Moving resource: 70

Destructor freeing data for nullptr

Destructor freeing data for : 10

Destructor freeing data for : 20

Destructor freeing data for : 30

Destructor freeing data for : 40

Destructor freeing data for : 50

Destructor freeing data for : 60

Destructor freeing data for : 70

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

极度宠爱 2025-02-04 03:02:33

因为STD ::向量在调整大小的同时仅在您具有 noexcept 移动构造函数时进行调整。
或者,您可以调用vec.Reserve(7)避免调整大小。

Because std::vector moves while resizing only if you have a noexcept move constructor.
Or you can call vec.reserve(7) to avoid resizing.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文