Objects C++ 中的创建和成员声明
Objects creation and members declaration in C++
我来自 Java
背景,我最近开始学习 Qt
和 C++
。在编写一些代码时,我对 object 的创建和成员声明产生了一些疑问:
假设我有一个 class 声明如下:
ClassA.h:
class ClassA {
private:
MyObject myObj;
QString *declaredArray;
QSharedPointer<MyObject> obj;
public:
void setInfo();
}
ClassA.cpp
void ClassA::setInfo() {
declaredArray = new QString[5];
obj = QSharedPointer<MyObject>(new MyObject, doDeleteLater);
}
在声明 MyObject myObj;
的 header 中发生了什么?是否在堆栈中创建了类型 MyObject
的 object 并使用不带参数的构造函数分配给变量 myObj
?或者只声明了一个准备存储 MyObject
object 的空变量?
在 ClassA.cpp
中,我如何将在堆栈中创建的新 object 分配给 myObj
变量?
declaredArray是在堆中创建的int
数组,我是否应该添加一个带有delete declaredArray;
的析构函数以避免内存泄漏?
在声明 QSharedPointer<MyObject> obj;
的 header 中发生了什么?是否创建了指向 MyObject
的空指针? ClassA.cpp
(obj = QSharedPointer<MyObject>(new MyObject, doDeleteLater);
) 中的赋值是否正确?
myObj
(大小为MyObject
)将有space分配ClassA
的地方(如果ClassA
分配在堆栈上, space for myObj
将在堆栈上)。
如果 MyObject
存在适用的默认构造函数,并且:
- 您定义一个显式默认构造函数如下:
ClassA() :
myObj(),
declaredArray(NULL),
obj(NULL) { }
- 您没有声明构造函数,因此导致编译器添加隐式声明的默认构造函数,这与上述功能大致相似。
...然后myObj
将被初始化为默认值(MyObject()
)。
另请注意,您使用 new
创建的任何堆分配内存都应在销毁时使用 delete
释放。因此,你还应该有一个析构函数:
~ClassA() {
if (delcaredArray != NULL) {
delete[] declaredArray;
}
}
多亏了 RAII,如果在 ClassA
构造函数中显式初始化,则无需析构 myObj
和 obj
。但是,如果它们不是,那么您将需要明确地销毁它们(例如,在共享指针的情况下,递减计数器)。
要明确回答您的其他问题:
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
关键字)就足够了。请注意,这会在 myObj
上调用 operator=()
(赋值运算符),因此需要已经定义 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表明它的默认构造函数是一个指向NULL
的QSharedPointer
。如果您有一个默认构造函数,它可以适当地为成员调用默认构造函数,那么您应该没问题。
一个正确构造的(例如默认或非默认构造,但已初始化)QSharedPointer
可以使用您展示的赋值运算符赋值:(obj = QShardPointer<MyObject>(new MyObject))
.
我来自 Java
背景,我最近开始学习 Qt
和 C++
。在编写一些代码时,我对 object 的创建和成员声明产生了一些疑问:
假设我有一个 class 声明如下:
ClassA.h:
class ClassA {
private:
MyObject myObj;
QString *declaredArray;
QSharedPointer<MyObject> obj;
public:
void setInfo();
}
ClassA.cpp
void ClassA::setInfo() {
declaredArray = new QString[5];
obj = QSharedPointer<MyObject>(new MyObject, doDeleteLater);
}
在声明 MyObject myObj;
的 header 中发生了什么?是否在堆栈中创建了类型 MyObject
的 object 并使用不带参数的构造函数分配给变量 myObj
?或者只声明了一个准备存储 MyObject
object 的空变量?
在 ClassA.cpp
中,我如何将在堆栈中创建的新 object 分配给 myObj
变量?
declaredArray是在堆中创建的int
数组,我是否应该添加一个带有delete declaredArray;
的析构函数以避免内存泄漏?
在声明 QSharedPointer<MyObject> obj;
的 header 中发生了什么?是否创建了指向 MyObject
的空指针? ClassA.cpp
(obj = QSharedPointer<MyObject>(new MyObject, doDeleteLater);
) 中的赋值是否正确?
myObj
(大小为MyObject
)将有space分配ClassA
的地方(如果ClassA
分配在堆栈上, space for myObj
将在堆栈上)。
如果 MyObject
存在适用的默认构造函数,并且:
- 您定义一个显式默认构造函数如下:
ClassA() : myObj(), declaredArray(NULL), obj(NULL) { }
- 您没有声明构造函数,因此导致编译器添加隐式声明的默认构造函数,这与上述功能大致相似。
...然后myObj
将被初始化为默认值(MyObject()
)。
另请注意,您使用 new
创建的任何堆分配内存都应在销毁时使用 delete
释放。因此,你还应该有一个析构函数:
~ClassA() {
if (delcaredArray != NULL) {
delete[] declaredArray;
}
}
多亏了 RAII,如果在 ClassA
构造函数中显式初始化,则无需析构 myObj
和 obj
。但是,如果它们不是,那么您将需要明确地销毁它们(例如,在共享指针的情况下,递减计数器)。
要明确回答您的其他问题:
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
关键字)就足够了。请注意,这会在 myObj
上调用 operator=()
(赋值运算符),因此需要已经定义 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表明它的默认构造函数是一个指向NULL
的QSharedPointer
。如果您有一个默认构造函数,它可以适当地为成员调用默认构造函数,那么您应该没问题。
一个正确构造的(例如默认或非默认构造,但已初始化)QSharedPointer
可以使用您展示的赋值运算符赋值:(obj = QShardPointer<MyObject>(new MyObject))
.