拷貝構(gòu)造函數(shù)

std::vector的拷貝和初始化

在C++中,拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),用于創(chuàng)建一個(gè)新對(duì)象,并使用同類型的另一個(gè)對(duì)象的值來初始化它??截悩?gòu)造函數(shù)通常在以下情況下被調(diào)用:

  1. 通過值傳遞方式傳遞對(duì)象給函數(shù)。

  2. 通過值返回方式從函數(shù)返回對(duì)象。

  3. 一個(gè)對(duì)象被另一個(gè)對(duì)象初始化。

    • 如下的直接初始化,這意味著我們要求編譯器使用普通的函數(shù)匹配來選擇與我們提供的參數(shù)最匹配的構(gòu)造函數(shù)
    • 如下的拷貝初始化,這意味著我們要求編譯器將右側(cè)運(yùn)算對(duì)象拷貝到我們正在創(chuàng)建的對(duì)象中(調(diào)用拷貝構(gòu)造函數(shù))
  4. 注意

    • std::vector無論通過直接初始化還是拷貝初始化,新的copiedVector的內(nèi)存都和原始的originalVector不同;兩者增刪改查互不影響
    • 即下面代碼輸出
    Original Vector: 1 2 3 4 5 
    Copied Vector:100 2 3 4 5 
    
#include <iostream>
#include <vector>

int main() {
    // 創(chuàng)建一個(gè)原始的 vector
    std::vector<int> originalVector = {1, 2, 3, 4, 5};

    // 使用拷貝構(gòu)造函數(shù)創(chuàng)建一個(gè)新的 vector,并初始化為原始 vector 的副本
    std::vector<int> copiedVector(originalVector);//直接初始化
    std::vector<int> copiedVector = originalVector;//拷貝初始化
    
    // 修改新 vector 的第一個(gè)元素
    copiedVector[0] = 100;
    
    // 輸出原始 vector 的內(nèi)容
    std::cout << "Original Vector: ";
    for (int num : originalVector) {
        std::cout << num << " ";//1 2 3 4 5 
    }
    
    std::cout << "\n";
    
    // 輸出新 vector 的內(nèi)容
    std::cout << "Copied Vector: ";
    for (int num : copiedVector) {
        std::cout << num << " ";//100 2 3 4 5 
    }
    
    return 0;

}

cv::Mat的拷貝和初始化

  • cv::Mat無論通過直接初始化還是拷貝初始化,新的copiedMat的內(nèi)存都和原始的originalMat相同;兩者增刪改查互相影響

  • 對(duì)于函數(shù)中的傳值與引用,也都是淺拷貝,數(shù)據(jù)的改變也都會(huì)影響到源數(shù)據(jù)(即值傳遞方式傳遞對(duì)象給函數(shù)時(shí)用的是拷貝構(gòu)造函數(shù))

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

originalMat.clone();
originalMat.copyTo(copiedMat4);
  • clone()copyTo的區(qū)別:它們除了對(duì)不同的矩陣頭文件做不同的內(nèi)存操作外,最大的區(qū)別在于,clone()是復(fù)制一整個(gè)一模一樣的Mat,而copyTo(),可以使用mask選擇復(fù)制的范圍,A.copyTo(B,mask)
  • 以下例子
int main(){
    // 創(chuàng)建一個(gè)原始的cv::Mat
    cv::Mat originalMat = cv::Mat::eye(3, 3, CV_32F);//創(chuàng)建一個(gè)3x3的單位矩陣

    cv::Mat copiedMat1(originalMat);//直接初始化
    cv::Mat copiedMat2 = originalMat;//拷貝初始化
    cv::Mat copiedMat3 = originalMat.clone();//使用cv::Mat的深拷貝函數(shù)
    cv::Mat copiedMat4;
    originalMat.copyTo(copiedMat4);//使用cv::Mat的深拷貝函數(shù)
    // 修改原始的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]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容