c++ - "nullptr"和 "NULL"的用例是什么以及区别

标签 c++

大家好,我刚刚看了一个关于 MOVE CONSTRUCTOR 的教程(比深度复制更好),我不太理解这些概念,我是初学者,不是专业人士,所以我需要你们的帮助来理解让我们开始: 首先是教程中的代码:

#include <iostream>
#include <vector>

using namespace std;

class Move {
private:
    int *data;
public:
    void set_data_value(int d) { *data = d; }
    int get_data_value() { return *data; }
    // Constructor
    Move(int d);
    // Copy Constructor
    Move(const Move &source);
    // Move Constructor
    Move(Move &&source) noexcept;
    // Destructor
    ~Move();
};

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

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

//Move ctor


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

好的,老师说的是“我们窃取数据并将指针清空,所以当我们将指针分配给 nullptre 时,我的问题发生了,它是否等于零,或者我们不能再达到它还是什么? ??”

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

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});
    vec.push_back(Move{80});


    return 0;
}
  

最佳答案

NULL 或多或少是简单时代的遗留物,当时 C++ 更接近其祖先 C。由于 C++ 第一次标准化(甚至更早),建议使用 0 表示空指针。 C++11 添加了 nullptr,它是 0NULL 的直接替代品。

但是 nullptr 的类型是 std::nullptr_t这对于模板和函数参数(用于重载)很有用。

关于c++ - "nullptr"和 "NULL"的用例是什么以及区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62626889/

相关文章:

c++ - CGAL 在 3D 中按 x 轴旋转

c++ - 转发到就地构造函数

c++ - MPI读取目录中的所有文件

c++ - C++创建头文件时,多个重载函数实例与参数列表匹配

c++ - 为什么 std::vector::emplace 调用析构函数而不调用任何复制构造函数?

c++ - SFML "failed to create the font face"问题

c++ - 如何在 Excel::Range 中包装在 VARIANT 中传递的 Excel Range 对象

c++ - 如何正确跳过 unicode (UTF-8) 字符?

c++ - 调用实例方法就好像它是静态方法一样

c++ - "const"在 C++ 中有多少和哪些用途?