Objects C++ 中的创建和成员声明

Objects creation and members declaration in C++

我来自 Java 背景,我最近开始学习 QtC++。在编写一些代码时,我对 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 存在适用的默认构造函数,并且:

  1. 您定义一个显式默认构造函数如下:
    ClassA() :
        myObj(),
        declaredArray(NULL),
        obj(NULL) { }
  1. 您没有声明构造函数,因此导致编译器添加隐式声明的默认构造函数,这与上述功能大致相似。

...然后myObj将被初始化为默认值(MyObject())。

另请注意,您使用 new 创建的任何堆分配内存都应在销毁时使用 delete 释放。因此,你还应该有一个析构函数:

~ClassA() {
    if (delcaredArray != NULL) {
        delete[] declaredArray;
    }
}

多亏了 RAII,如果在 ClassA 构造函数中显式初始化,则无需析构 myObjobj。但是,如果它们不是,那么您将需要明确地销毁它们(例如,在共享指针的情况下,递减计数器)。


要明确回答您的其他问题:

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表明它的默认构造函数是一个指向NULLQSharedPointer。如果您有一个默认构造函数,它可以适当地为成员调用默认构造函数,那么您应该没问题。

一个正确构造的(例如默认或非默认构造,但已初始化)QSharedPointer 可以使用您展示的赋值运算符赋值:(obj = QShardPointer<MyObject>(new MyObject)).