使用()或不创建对象之间的区别

Dir*_*irk 18 c++ qt most-vexing-parse

我刚遇到这个问题

error: request for member ‘show’ in ‘myWindow’, which is of non-class type ‘MainGUIWindow()’
Run Code Online (Sandbox Code Playgroud)

当试图编译一个简单的qt应用程序时:

#include <QApplication>
#include "gui/MainGUIWindow.h"


int main( int argc, char** argv )
{
  QApplication app( argc, argv );


  MainGUIWindow myWindow();
  myWindow.show();


  return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

我通过替换解决了这个问题

MainGUIWindow myWindow(); 
Run Code Online (Sandbox Code Playgroud)

通过

MainGUIWindow myWindow;
Run Code Online (Sandbox Code Playgroud)

但我不明白其中的区别.我的问题:有什么区别?

此致,德克

Arm*_*yan 41

其他答案正确地说明括号版本实际上是一个函数声明.要直观地理解它,假设你写的MainGUIWindow f();看起来更像是一个函数,不是吗?:)更有趣的问题是有什么区别

MainGUIWindow* p = new MainGUIWindow;
Run Code Online (Sandbox Code Playgroud)

MainGUIWindow* p = new MainGUIWindow();
Run Code Online (Sandbox Code Playgroud)

带括号的版本称为值初始化,而没有括号的版本称为默认初始化.对于非POD类,两者之间没有差异.但是,对于POD结构,值初始化involes将所有成员设置为0,

MY2C

另外:一般来说,如果某些语法结构可以解释为声明和其他内容,编译器总是解决歧义而支持声明.

  • 这被称为“最令人烦恼的解析”。 (2认同)

Max*_*kin 17

下列:

MainGUIWindow myWindow();
Run Code Online (Sandbox Code Playgroud)

声明一个不带参数和返回的函数MainGUIWindow.即myWindow功能名称.

MainGUIWindow myWindow;
Run Code Online (Sandbox Code Playgroud)

另一方面,创建一个myWindow类型的对象MainGUIWindow.