c++ - C++中的对象创建和成员声明

标签 c++ qt oop qsharedpointer

我来自 Java背景和我最近开始学习QtC++ .在编写一些代码时,我遇到了一些关于对象创建和成员声明的疑问:

假设我有一个声明如下的类:

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变量?

declaredArrayint 的数组它是在堆中创建的,我应该添加一个带有 delete declaredArray; 的析构函数吗?以避免内存泄漏?

header 中发生了什么 QSharedPointer<MyObject> obj;被宣布?是指向 MyObject 的空指针创造?是ClassA.cpp中的赋值吗? ( obj = QSharedPointer<MyObject>(new MyObject, doDeleteLater); ) 正确吗?

最佳答案

将有空间用于 myObj (大小为 MyObject )无论在哪里 ClassA已分配(如果 ClassA 在堆栈上分配,myObj 的空间将在堆栈上)。

如果 MyObject 存在适用的默认构造函数,或者:

  1. 您定义一个显式默认构造函数如下:
    ClassA() :
        myObj(),
        declaredArray(NULL),
        obj(NULL) { }
  1. 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,你不需要破坏 myObjobj如果在 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/

相关文章:

c++ - 适用于容器每个成员的 STL 函数是否可以接受外部参数?

c++ - 打开文件不起作用

c++ - AStyle 嵌套类格式化

multithreading - 停止 QRunnable 导致主窗口无法关闭

c++ - QSplitter 显示两个小部件之间的分隔符或边距

Python3 - 如何从现有抽象类定义抽象子类?

actionscript-3 - 在 AS3 中组合颜色和 Alpha

c++ - brew 警告 : dependency was built with a different C++ standard library

qt - 如何检查 QString 是否仅包含 "invisible"个字符?

python - 如何找到在 Blackjack 中获得 21 的方法数?