C++ 在构造函数中将 0 分配给 class 变量时会发生什么
C++ what happens when 0 is assigned to class variable in constructor
我正在尝试创建一个智能指针,无意中发现了下面的代码。由于我是 C++ 的新手,它的语法是我必须习惯的东西。
下面你可以看到代码中最重要的部分,其中 RC
是引用计数器 class 和一个名为 count
的成员变量(类型 int
) .函数 addRef
将 count
递增 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
分配给 pData
和 reference
时究竟发生了什么?
另外,这里省略了一个“默认参数”是不是有什么原因呢?像这样:
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
表示指针不指向任何东西。
- 为默认成员值使用成员初始值设定项。
- 当默认值不同时,使用初始化列表指定成员初始值代替默认值。
- 奖励:始终将您的
new
与 delete
匹配,即使在示例代码中也是如此。
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;
}
//...
}
我正在尝试创建一个智能指针,无意中发现了下面的代码。由于我是 C++ 的新手,它的语法是我必须习惯的东西。
下面你可以看到代码中最重要的部分,其中 RC
是引用计数器 class 和一个名为 count
的成员变量(类型 int
) .函数 addRef
将 count
递增 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
分配给 pData
和 reference
时究竟发生了什么?
另外,这里省略了一个“默认参数”是不是有什么原因呢?像这样:
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
表示指针不指向任何东西。 - 为默认成员值使用成员初始值设定项。
- 当默认值不同时,使用初始化列表指定成员初始值代替默认值。
- 奖励:始终将您的
new
与delete
匹配,即使在示例代码中也是如此。
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;
}
//...
}