std::队列初始化与 NULL

std::queue initialization with NULL

本文关键字:NULL 队列 std 初始化      更新时间:2023-10-16

是否可以像其他变量一样用NULL值初始化C++ std::queue

喜欢这个:

HANDLE variable = NULL; 
class Test
{
}

std::queue<Test*> testQueue = NULL;

testQueue.empty();

或类似的东西?

如果你写这个:

std::queue<Test*> testQueue; //it is default initialized

那么这就足够了;不需要让它成为指针并用 NULL 初始化它。

此外,您可以这样做:

if ( testQueue.empty()) 
{
    //testQueue is empty
}

如果使用指向队列的指针,则当然可以将其初始化为空指针(但如果可能的话,您可能希望避免这种情况)。

如果您只是定义一个队列,则可以测试它是否为空(如您所建议的,使用 .empty() )。

要直接回答您的问题,请不要使用空指针对其进行初始化。默认情况下,队列为空,这就是您测试的内容(如其他答案所示)。但是,我认为这里有一个比这更深入的潜在问题,那就是在指针方面考虑得太多。

由于您使用的是容器,因此我建议您不要使用std::queue<Object *>。相反,我建议尽可能使用std::queue<Object>(存储对象,而不是指针)。不要使用任何类型的 null 值来指示对象未处于有效状态,只需初始化构造函数中的值(以便所有对象都处于有效状态),然后std::queue中的所有对象都有效。在C++中,这应该是您对如何使用对象的偏好:

  1. 如果需要处理对象集合,则直接在堆栈上创建对象或存储在容器(最好是 STL 容器)中的对象
  2. 引用
  3. (例如,如果要将对象传递到函数中并希望避免复制,但此处引用是指通过1创建的对象)
  4. 智能指针(这应该是new出现在代码中的唯一时间)。应谨慎使用它们,并且仅当您确定通过1创建对象不起作用时。
  5. 常规指针。这几乎不应该被使用。在我的大多数项目中,我不使用任何原始指针。在其余部分,我只将它们用作一种缓存机制,其中长计算确定我正在操作哪个对象,而空指针表示我尚未确定它。但是,我仍然没有创建对象的"主"句柄是指针;指针指向我通过 1 创建的对象。

在确定要在容器中存储的内容时,还应遵循上述操作(首先首选对象集合,然后是引用,然后是智能指针,最后是原始指针)。

指针在 Java 中可能很常见,其中大多数变量都是在堆上创建的(或者用C++的说法,从自由存储中创建),它们在 C 中可能有些常见,其中 STL、引用和智能指针不存在,但它们在现代C++中没有太多位置。

队列

是带有构造函数的C++对象。无需将其初始化为默认值。它始终以空队列开头。 .empty()只是检查它是否为空。 如果需要,.clear()会删除其内容,但在新建的上,这不是必需的。