我来自 Java
背景和我最近开始学习Qt
与 C++
.在编写一些代码时,我遇到了一些关于对象创建和成员声明的疑问:
假设我有一个声明如下的类:
ClassA.h:
class ClassA {
private:
MyObject myObj;
QString *declaredArray;
QSharedPointer<MyObject> obj;
public:
void setInfo();
}
A类.cpp
void ClassA::setInfo() {
declaredArray = new QString[5];
obj = QSharedPointer<MyObject>(new MyObject, doDeleteLater);
}
header 中发生了什么 MyObject myObj;
被宣布?是 MyObject
类型的对象在堆栈中创建并分配给变量 myObj
使用不带参数的构造函数?或者只有一个空变量准备存储 MyObject
对象被声明?
在ClassA.cpp
我如何将在堆栈中创建的新对象分配给 myObj
变量?
declaredArray 是 int
的数组它是在堆中创建的,我应该添加一个带有 delete declaredArray;
的析构函数吗?以避免内存泄漏?
header 中发生了什么 QSharedPointer<MyObject> obj;
被宣布?是指向 MyObject
的空指针创造?是ClassA.cpp
中的赋值吗? ( obj = QSharedPointer<MyObject>(new MyObject, doDeleteLater);
) 正确吗?
最佳答案
将有空间用于 myObj
(大小为 MyObject
)无论在哪里 ClassA
已分配(如果 ClassA
在堆栈上分配,myObj
的空间将在堆栈上)。
如果 MyObject
存在适用的默认构造函数,或者:
- 您定义一个显式默认构造函数如下:
ClassA() : myObj(), declaredArray(NULL), obj(NULL) { }
- You have no constructors declared, thus causing an implicitly-declared default constructor to be added by the compiler, which roughly resembles the above functionality.
... then myObj
will be initialized to the default value (MyObject()
).
Also note that any heap-allocated memory you create with new
should be deallocated with delete
on destruction. Therefore, you should also have a destructor:
~ClassA() {
if (delcaredArray != NULL) {
delete[] declaredArray;
}
}
感谢 RAII,你不需要破坏 myObj
和 obj
如果在 ClassA
中显式初始化构造函数。但是,如果它们不是,那么您将需要明确地销毁它们(例如,在共享指针的情况下,递减计数器)。
要明确回答您的其他问题:
What happened in the header where MyObject myObj; was declared? Was an object of type MyObject created in the stack and assigned to variable myObj using a constructor which takes no arguments? Or only an empty variable prepared to store a MyObject object was declared?
myObj
如果默认构造函数存在并已创建(隐式或显式),则只会默认构造(使用不带参数的构造函数构造)。
In ClassA.cpp how would I assign a new object created in the stack to myObj variable?
如果myObj
有效,则 myObj = MyObject(...);
(没有 new
关键字)就足够了。请注意,这将调用 operator=()
(赋值运算符)在 myObj
上, 所以 myObj
需要已经定义,这是完全定义的行为。如果它已经是默认构造的,那么 myObj = MyObject(...);
很好。
declaredArray is an array of int’s created in the heap, should I add a destructor with a delete declaredArray; to avoid memory leaks?
是的,你应该,如上所示。
What happened in the header where QSharedPointer obj; was declared? Was an empty pointer to MyObject created? Is the assignment in ClassA.cpp (obj = QSharedPointer(new MyObject, doDeleteLater);) correct?
documentation for QSharedPointer显示其默认构造函数是 QSharedPointer
指向 NULL
.如果您有一个默认构造函数,它可以适本地为成员调用默认构造函数,那么您应该没问题。
正确构造(例如默认或非默认构造,但已初始化)QSharedPointer
可以分配给使用赋值运算符,如您所示:(obj = QShardPointer<MyObject>(new MyObject))
.
关于c++ - C++中的对象创建和成员声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27833492/