c ++在对象声明中分配对象

gma*_*ett 2 c++ java qt

我来自Java背景,最近决定尝试创建一个"有趣"的C++ Qt GUI应用程序.我一直在努力解决Java和c ++之间的许多细微差别,但我学到了很多东西.

我试图在我的C++编码中尽可能地匹配"java风格"语法.虽然这可能是也可能不是C++的"最佳实践",但我觉得在学习保持熟悉且一致的语法时会有所帮助.其中一个java语法残留是这样的:

//Java
MyObject o = new MyObject();

//C++
MyObject o = MyObject();
Run Code Online (Sandbox Code Playgroud)

现在,我理解C++有上面的语法快捷方式:

//C++
MyObject o();
Run Code Online (Sandbox Code Playgroud)

这很好,但正如我所说,我不想使用不同的语法.一切都很好,但是当我尝试下面的Qt代码时,我收到了一个惊喜:

QString filepath = "C:\\somefile";
QFile file = QFile(filepath);
Run Code Online (Sandbox Code Playgroud)

并得到编译错误:

c:\QtSDK\Desktop\Qt\4.7.2\mingw\include/QtCore/qfile.h:195: error: 'QFile::QFile(const QFile&)' is private within this context
Run Code Online (Sandbox Code Playgroud)

我读了Qt文档,发现确实没有公共构造函数QFile :: QFile(const QFile&).我的代码以前用于其他类的地方,有这样的构造函数.我可以在这里猜测并说出这条线:

QFile file = QFile(filepath);
Run Code Online (Sandbox Code Playgroud)

实际上是调用两个构造函数.谁能解释一下?

Eri*_*rik 7

//Java
MyObject o = new MyObject();

//C++
MyObject o = MyObject();
Run Code Online (Sandbox Code Playgroud)

这些并不等同.c ++版本在堆栈上创建一个新对象,java只能用基本类型创建.一旦o超出范围,它将被破坏.上面实际发生的是逻辑上MyObject o(MyObject());(不正确的实际语法) - 构造后跟复制构造.

MyObject * o = new MyObject();
Run Code Online (Sandbox Code Playgroud)

这与你的java版本一样接近.当然,需要注意的是,在C++中你还需要delete o;- 它不会被垃圾收集.

QFile file = QFile(filepath);
Run Code Online (Sandbox Code Playgroud)

这将再次在堆栈上创建一个临时QFile,然后file通过从临时复制构造它来创建.它相当于QFile file(QFile(filepath));.在你的情况下这不起作用,QFile不允许复制构造,所以你需要通过直接构建QFile来避免临时,

// on stack:
QFile file(filepath);

//or in heap:
QFile * file = new QFile(filepath);
Run Code Online (Sandbox Code Playgroud)

  • 实际上,`MyObject o(MyObject());`将是一个函数`o`的声明,它返回一个`MyObject`,它接受一个不带参数的函数的匿名指针并返回一个`MyObject`. (2认同)