保存指针与传递值为const

时间:2017-05-04 12:18:31

标签: c++

这是我从未得到的c ++理论。

我有一个非常大的小结构列表(大小),在A类中称为节点。 所以我有:

private:
   QList<Node> nodes;

现在,A类具有B类实例(称为cB),并且对于其中一个函数,它需要迭代节点并只读取它们(它不会以任何方式修改信息)。

function ClassB::readNodes(){
   for (int i = 0; i < nodes.size(); i++){
       // READ nodes and do stuff with that information
   }
}

据我所知,有两种方法可以解决这个问题。这是我目前的方法内部B类我有:

public:
    void setNodes(const QList *list) {nodes = list;}
private:
    QList<Node> *nodes;

然后在A类的某个地方我做:

cb.setNodes(&nodes);

这种方法的目的是我希望每次调用readNodes()时都避免复制非常大的数据结构,并且内存中只有一个数据结构副本。这很重要,因为A类将不断更改节点。

在我看来,第二种方法更简单,更清晰。只需将readNodes定义为:

function ClassB::readNodes(const QList<Node> &nodes){
   for (int i = 0; i < nodes.size(); i++){
       // READ nodes and do stuff with that information
   }
}

但我并不完全确定这会导致性能下降。据我所知,这种方法也将节点视为参考,因此不会出现节点的深层副本。这是对的吗?

1 个答案:

答案 0 :(得分:2)

大多数Qt类(包括容器类)都是implicitly shared。因此,即使您按价值传递它们,在访问这些项目之前也不会有深层复制。 传递对象的const引用是一种更通用和安全的方法。