拷贝构造函数

std::vector的拷贝和初始化

在C++中,拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,并使用同类型的另一个对象的值来初始化它。拷贝构造函数通常在以下情况下被调用:

  1. 通过值传递方式传递对象给函数。

  2. 通过值返回方式从函数返回对象。

  3. 一个对象被另一个对象初始化

    • 如下的直接初始化,这意味着我们要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数
    • 如下的拷贝初始化,这意味着我们要求编译器将右侧运算对象拷贝到我们正在创建的对象中(调用拷贝构造函数)
  4. 注意

    • std::vector无论通过直接初始化还是拷贝初始化,新的copiedVector的内存都和原始的originalVector不同;两者增删改查互不影响
    • 即下面代码输出
    Original Vector: 1 2 3 4 5 
    Copied Vector:100 2 3 4 5 
    
#include <iostream>
#include <vector>

int main() {
    // 创建一个原始的 vector
    std::vector<int> originalVector = {1, 2, 3, 4, 5};

    // 使用拷贝构造函数创建一个新的 vector,并初始化为原始 vector 的副本
    std::vector<int> copiedVector(originalVector);//直接初始化
    std::vector<int> copiedVector = originalVector;//拷贝初始化
    
    // 修改新 vector 的第一个元素
    copiedVector[0] = 100;
    
    // 输出原始 vector 的内容
    std::cout << "Original Vector: ";
    for (int num : originalVector) {
        std::cout << num << " ";//1 2 3 4 5 
    }
    
    std::cout << "\n";
    
    // 输出新 vector 的内容
    std::cout << "Copied Vector: ";
    for (int num : copiedVector) {
        std::cout << num << " ";//100 2 3 4 5 
    }
    
    return 0;

}

cv::Mat的拷贝和初始化

  • cv::Mat无论通过直接初始化还是拷贝初始化,新的copiedMat的内存都和原始的originalMat相同;两者增删改查互相影响

  • 对于函数中的传值与引用,也都是浅拷贝,数据的改变也都会影响到源数据(即值传递方式传递对象给函数时用的是拷贝构造函数)

    void A(cv::Mat image)  
    void A(cv::Mat& image)
    
  • 若要采用深拷贝,需要使用

originalMat.clone();
originalMat.copyTo(copiedMat4);
  • clone()copyTo的区别:它们除了对不同的矩阵头文件做不同的内存操作外,最大的区别在于,clone()是复制一整个一模一样的Mat,而copyTo(),可以使用mask选择复制的范围,A.copyTo(B,mask)
  • 以下例子
int main(){
    // 创建一个原始的cv::Mat
    cv::Mat originalMat = cv::Mat::eye(3, 3, CV_32F);//创建一个3x3的单位矩阵

    cv::Mat copiedMat1(originalMat);//直接初始化
    cv::Mat copiedMat2 = originalMat;//拷贝初始化
    cv::Mat copiedMat3 = originalMat.clone();//使用cv::Mat的深拷贝函数
    cv::Mat copiedMat4;
    originalMat.copyTo(copiedMat4);//使用cv::Mat的深拷贝函数
    // 修改原始的cv::Mat
    originalMat.at<float>(0, 0) = 99;

    std::cout << "Original Matrix:\n" << originalMat << "\n";
    std::cout << "Copied Matrix1:\n" << copiedMat1 << "\n";
    std::cout << "Copied Matrix2:\n" << copiedMat2 << "\n";
    std::cout << "Copied Matrix3:\n" << copiedMat3 << "\n";
    std::cout << "Copied Matrix4:\n" << copiedMat4 << "\n";

    return 0;    
}
//输出:
Original Matrix:
[99, 0, 0;
 0, 1, 0;
 0, 0, 1]
Copied Matrix1:
[99, 0, 0;
 0, 1, 0;
 0, 0, 1]
Copied Matrix2:
[99, 0, 0;
 0, 1, 0;
 0, 0, 1]
Copied Matrix3:
[1, 0, 0;
 0, 1, 0;
 0, 0, 1]
Copied Matrix4:
[1, 0, 0;
 0, 1, 0;
 0, 0, 1]
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容