C++ 在构造函数中将 0 分配给 class 变量时会发生什么

C++ what happens when 0 is assigned to class variable in constructor

我正在尝试创建一个智能指针,无意中发现了下面的代码。由于我是 C++ 的新手,它的语法是我必须习惯的东西。

下面你可以看到代码中最重要的部分,其中 RC 是引用计数器 class 和一个名为 count 的成员变量(类型 int) .函数 addRefcount 递增 1.

template < typename T > class SP
{
private:
    T*    pData;       // pointer
    RC* reference; // Reference count

public:
    SP() : pData(0), reference(0) 
    {
        reference = new RC();
        reference->AddRef(); // Increment the reference count
    }
//...
}

现在,当构造函数将 0 分配给 pDatareference 时究竟发生了什么?

另外,这里省略了一个“默认参数”是不是有什么原因呢?像这样:

SP() : pData(0), reference(new RC())

它将在构造函数序言中的构造函数代码 运行 之前初始化为 0。然后在构造函数中分配它时被覆盖为另一个值。

你是对的 - 你可以在构造函数成员初始化列表中做 reference(new RC()) 。原始开发人员这样做可能只是风格上的,或者他们可能希望有机会在那里放置断点。或者他们可以使用不支持更复杂初始化器的旧编译器。

设置为 0 并在不读取值的情况下立即覆盖它很可能会被编译器优化器抛出,因此这并不是真正的性能损失。

PS:不是默认参数。默认参数由调用者填写,这个被调用者得到运行

由于历史原因,0等同于nullptr,意思是“一个不指向任何东西的指针”。在现代代码中,您应该始终使用 nullptr,而不是 0.

Is this the way to go or are there "better" best practices?

抛开对正在执行的内容的担忧,编写问题中提供的相同功能的最惯用方法是:

  • nullptr表示指针不指向任何东西。
  • 为默认成员值使用成员初始值设定项。
  • 当默认值不同时,使用初始化列表指定成员初始值代替默认值。
  • 奖励:始终将您的 newdelete 匹配,即使在示例代码中也是如此。
template < typename T > class SP
{
private:
    T*  pData = nullptr;
    RC* reference = nullptr;

public:
    SP() : reference(new RC()) 
    {
        reference->AddRef();
    }

    SP(const SP&) = delete;
    SP& operator=(const SP&) = delete;
    
    ~SP() { 
      delete reference; 
    }
//...
}