C++ 通过对对象的引用构造类

C++ 通过对对象的引用构造类,c++,pointers,opencv,C++,Pointers,Opencv,我试图理解在我使用的库中实现的类中使用的构造函数。class SequenceAnalyzer的关键组件如下所示: class SequenceAnalyzer { protected: std::vector<cv::Mat> images_; public: SequenceAnalyzer( std::vector<cv::Mat> *images = NULL ) { if (images != NULL)

我试图理解在我使用的库中实现的类中使用的构造函数。class SequenceAnalyzer的关键组件如下所示:

class SequenceAnalyzer {
  protected:
    std::vector<cv::Mat> images_;

  public:
    SequenceAnalyzer( std::vector<cv::Mat> *images = NULL )
    {
        if (images != NULL)
          images_ = (*images);
    }

};
类序列分析器{
受保护的:
矢量图像;
公众:
SequenceAnalyzer(std::vector*images=NULL)
{
如果(图像!=NULL)
图像=(*图像);
}
};
在main中构造此类的实例时,我将引用传递给向量:

std::vector<cv::Mat> myImages;
SequenceAnalyzer se(&myImages);
std::vector<cv::Mat> myImages;
SequenceAnalyzer se(&myImages);
std::vector myImages;
SequenceAnalyzer se(&myImages);
现在通过引用传入我的图像将它们在内存中的位置传递给类。但我对(*images)运算符的理解是,它们的地址已被取消引用,因此=运算符随后会复制内容


以这种方式将myImages传递到类中有什么好处吗?如果指针没有节省复制开销,为什么要首先使用它?

没有任何优势。我将编写与以下代码相同的代码:

SequenceAnalyzer( const std::vector<cv::Mat>& images = std::vector<cv::Mat>()) :
    images_(images)
{
}
SequenceAnalyzer(const std::vector&images=std::vector()): 图像(图像) { } 现在我不需要担心指针:

std::vector<cv::Mat> myImages;
SequenceAnalyzer se(myImages);
std::vector myImages;
序列分析仪se(myImages);

通过指针(或引用)而不是通过值传递参数,避免临时复制。因此,复制只在需要时进行,而不是在将其作为参数传递时进行。另一个优点是,您可以有一个空的默认参数,而无需创建默认构造函数。在这种情况下,隐式默认构造函数也应该这样做

更优雅的方式可以是:

SequenceAnalyzer(const std::vector<cv::Mat>& images) {
  images_ = images;
}
SequenceAnalyzer(常量标准::向量和图像){
图像=图像;
}
没有临时副本(您通过引用传递),使用此副本的用户确保图像不会被修改

在main中构造此类的实例时,我将 对向量的引用:

std::vector<cv::Mat> myImages;
SequenceAnalyzer se(&myImages);
std::vector<cv::Mat> myImages;
SequenceAnalyzer se(&myImages);

现在,您有了您的参考参数、默认值,并且正在正确初始化。

知道即使复制向量,也只会复制图像标题(包含类型、宽度、高度等的结构),这可能会有所帮助。Mat对象封装了一个指向数据的智能指针,因此只有在调用特定函数(Mat::copyTo(),Mat::clone())时才会发生图像数据的深度复制。

我在这里看不到任何引用。如果你指的是引用和指针之间的区别,恐怕这对我来说是一个模糊的主题。如果你的意思是我说的是哪个库,那就是。你把它作为指向
向量
对象myImages的指针传递。@Chris:是前者,我可以告诉你。:)但是,在原始帖子中,他们的方式确实是坏的C++风格:)你也可以用引用的方式拥有一个默认参数。@ ToMalaKeGET'KAL是的,但它必须是一个实例化对象。@亚历山德罗佩扎托:如果你以前是实例化的,那么,它就不存在了。(就像一个静态变量)或是临时实例化。我想他是在询问引用或指针VS值,而不是在两者之间。@ TaMalaGeelt’Kal:可能,但从问题上不清楚。至于参考指针,我的印象是C++倾向于在函数定义中使用引用而不是指针,但这只是我的印象。上面的e代码看起来肯定比原来的更吸引人。“如果它最终不会节省复制开销”我认为很明显,他想要比较复制的东西和不复制的东西。@TomalakGeret'kal:如果问题是关于指针和值,那么指针确实保存了一个副本,然后你引用的问题就不适用了。所以我得出结论,问题是关于指针和引用的,或者更可能是OP不了解他自己.