【问题标题】:Passing pointer to constructor of class将指针传递给类的构造函数
【发布时间】:2022-01-21 05:20:54
【问题描述】:

我不太确定将*dd2 传递给构造函数之间的区别是:

#include <iostream>

using namespace std;

class Data
{

public:
    int number;
};

class Node {

public:

    Data data;  

    Node() {};

    Node(Data d) : data(d) {};

};

int main()
{
    
    Data* d = new Data();
    Node* n = new Node(*d);
    
    Data d2;
    Node* n2 = new Node(d2);


    return 0;
} 

我可以传递 *d 和 d2,但是在这两种情况下,“Node”类中的数据成员“data”本身仍然是一个对象,对吗?或者传递对象和动态对象之间有区别吗?

【问题讨论】:

  • 这里有三个Data对象:类中的data成员,d构造函数参数,以及dd2。前两个不在乎第三个。
  • 对。由于这是 C++ 而不是 C#,所有这 4 个对象都是单独的对象,当您将一个对象分配给另一个对象时,您就是将数据从一个对象复制到另一个对象。 (如果你想检查这个,你可以用printf打印出任何对象的地址。)
  • @David Grayson 谢谢,这回答了我的问题:)
  • 其实我们看看,有4个长寿命的数据对象,从main函数的角度来看,它们被命名为:*dd2n-&gt;data和@ 987654334@。当您调用 Node 构造函数 Node(Data d) 时,还会创建 2 个 临时 数据对象,因为调用涉及在名为 d 的堆栈上创建一个 Data 对象,并且您调用构造函数两次.所以看到了 6 个 Data 对象,并且执行了几个复制(或移动)操作以在它们之间传递数据。

标签: c++ object pointers


【解决方案1】:

Node 的角度来看,构造函数接收到一个Data 对象。它不关心这个对象是否使用new动态分配。

【讨论】:

    【解决方案2】:

    从节点的角度来看,节点的构造函数需要一个数据类型的对象,所以它只关心数据对象的类型,不关心它在内存中的位置(静态内存或动态内存) *d 和 d2 代表数据对象,所以你的代码是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2023-03-22
      • 2014-07-08
      • 1970-01-01
      • 2022-11-02
      • 2018-02-06
      • 1970-01-01
      相关资源
      最近更新 更多