10

我一直在看一个 Qt教程,它使用了我以前从未见过的结构:

 (void) new QShortcut(Qt::Key_Enter, this, SLOT(fire()));
 (void) new QShortcut(Qt::Key_Return, this, SLOT(fire()));
 (void) new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close()));

我已经在没有的情况下尝试过(void)它,它仍然可以编译和工作,那么 的目的是(void)什么?

4

3 回答 3

21

将表达式转换为 (void) 基本上告诉编译器忽略该表达式的结果(在计算之后)。

在您的示例中,每个表达式(每个语句/行)都通过 new 运算符动态分配内存 - 并且由于 new 返回指向内存的指针(地址),通常的做法是将该指针存储在一个变量中,您可以用于最终删除对象并释放内存。在您的示例中,由于指针被丢弃,因此对 (void) 的显式强制转换使程序员的意图变得清晰:“我确切地知道我在做什么 - 请丢弃 new 返回的值”

如果您对技术感兴趣(引用 C++ 标准,第 5 条):

任何表达式都可以显式转换为 cv void 类型。表达式值被丢弃。[注意:但是,如果值在临时变量(12.2)中,则该变量的析构函数直到通常时间才会执行,并且保留变量的值以用于执行析构函数。—end note ]
左值到右值 (4.1)、数组到指针 (4.2) 和函数到指针 (4.3) 标准转换不适用于表达式。

如果你想知道这些对象是如何被删除的(如果它们确实被删除了),答案是 QShortcut 的构造函数中的“this”指针应该与 new 返回的值相同,并且可以传递到 ShortcutManager。请注意,构造函数中的“this”与传递给 QShortcut 构造函数的“this”指针不同。

于 2009-06-22T22:38:43.860 回答
7

如果你丢弃这样的函数的返回值,一些 C++ 编译器会发出警告。在这种情况下,代码看起来会泄漏内存,因此您会收到警告。告诉编译器(void)不要发出警告:“将此函数视为返回void”。

于 2009-06-22T22:38:28.913 回答
0

我认为从new语句返回的引用没有分配给指针。我看到它this正在被传递,所以 QT 必须对该引用做一些事情。

于 2009-06-22T22:40:09.473 回答