簡體   English   中英

在C ++中復制數組-參考

[英]Copying an array in c++ - reference

我有一個由dobule A [2] [2]組成的matrix2d類。 我試圖做一個構造器,該構造器使用相同類型的對象並將其所有值復制到A [2] [2]。 我有問題,這是課程:

class matrix2D {
    public:
    double A[2][2];
    double Z[2][2];

    //Default Constructor.
    matrix2D() {
        A[0][0] = A[1][1] = 1;
        A[0][1] = A[1][0] = 0;
    }

    matrix2D(double x00,double x01, double x10, double x11) {
        A[0][0] = x00;
        A[0][1] = x01;
        A[1][0] = x10;
        A[1][1] = x11;
    }

現在我要創建一個構造函數,該構造函數將使用matrix2D對象,然后將其所有值傳遞給A。

// Copy Constructor.
    matrix2D(matrix2D& Z) {
        for(int i = 0; i < 2; ++i) {
            for(int j = 0; j < 2; ++j) {
                   A[i][j]=*(Z[i][j]);
            }
        }
    }

它告訴我,我嘗試將double分配給matrix2d對象。 * Z [i] [j]為什么不引用雙精度數?

解決:我做了A [i] [j] = ZA [i] [j] :)!

該行中的*沒有意義。

給定數據,您根本不需要復制構造函數。 但是,如果必須實現一個,則必須遵循以下原則:

// Use const&, not just &.
// Use a more suitable variable name for the copy
matrix2D(matrix2D const& copy) {
    for(int i = 0; i < 2; ++i) {
        for(int j = 0; j < 2; ++j) {
               A[i][j]= copy.A[i][j];  // Copy A
               Z[i][j]= copy.Z[i][j];  // Copy Z.
        }
    }
}

復制構造函數中有問題,您正在隱藏成員之一(成員名稱Z和參數名稱Z )。

我建議不要編寫自己的副本構造函數,而讓編譯器為您生成一個:

matrix2D(const matrix2D & value) = default;

添加第二個答案。 這就是我更喜歡的答案。

只需從類聲明和定義中完全刪除復制構造函數即可。

鑒於您的類僅包含一對固定大小的數組,因此不需要復制構造函數。 編譯器將自動為您生成一個。 通常只有在類具有動態分配的成員變量並且需要確保指針值在實例之間沒有別名時,才需要使用自定義副本構造函數。

您當然可以使用for循環技術-我認為這將有助於您對數組和指針的理解。 但是,很難擊敗memcpy來復制簡單類型數組的效率。

   // Copy Constructor.
    matrix2D(const matrix2D& other) {

        memcpy(A, other.A, sizeof(A));
        memcpy(Z, other.Z, sizeof(Z));

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM