簡體   English   中英

隱藏復制構造函數C ++

[英]Hidden copying constructor C++

我想創建無法復制的類,因此我將復制構造函數放入專用部分:

class NotCopyable
{
public:
    NotCopyable(const double& attr1, const double& attr2) : _attr1(attr1), _attr2(attr2) {}
    ~NotCopyable(void) {}

private:
    NotCopyable& operator=(const NotCopyable&);
    NotCopyable(const NotCopyable&);
    double _attr1;
    double _attr2;
};

一切正常,除了我想分配數組時:

NotCopyable arr[] =
{
    NotCopyable(1, 0),
    NotCopyable(2, 3)
};

編譯器說她無法訪問復制構造函數,因為它在private節中。 當我將其放在公共區域時:

class NotCopyable
{
public:
    NotCopyable(const double& attr1, const double& attr2) : _attr1(attr1), _attr2(attr2) {}
    ~NotCopyable(void) {}
    NotCopyable(const NotCopyable&)
    {
        std::cout << "COPYING" << std:: endl;
    }
private:
    NotCopyable& operator=(const NotCopyable&);

    double _attr1;
    double _attr2;
};

程序編譯沒有錯誤,但是沒有調用復制構造函數。 所以問題是:如何禁止復制但仍然有可能分配數組?

您的代碼arr [] = { NotCopyable(1,2) }; 確實至少在形式上要求復制構造函數。 實際上,通常會刪除該副本,但這屬於“假設”規則,並且即使最終沒有使用副本構造函數,仍然必須可以訪問該副本構造函數。 (在GCC中,您可以說-fno-elide-constructors實際調用復制構造函數。)

您無法在C ++ 03中解決此問題,因為在括號中初始化總是需要正式的副本。 但是,在C ++ 11中,可以使用括號初始化直接初始化數組成員:

NotCopyable arr[] { {1, 0}, {2, 3} };

即使沒有可訪問的副本構造函數,此方法也有效。

這是不正確的,因為您使用必須通過復制創建的對象數組:

#include <vector>
using namespace std;

class NotCopyable
{
public:
    NotCopyable(const double& attr1, const double& attr2) : _attr1(attr1), _attr2(attr2) {}
    ~NotCopyable(void) {}

private:
    NotCopyable& operator=(const NotCopyable&);
    NotCopyable(const NotCopyable&);
    double _attr1;
    double _attr2;
};

int main()
{
    vector<NotCopyable> v;
    NotCopyable a(1, 2);
    v.push_back(a); // THIS IS COPYING
    return 0;
}

由於您已禁用復制,因此只能存儲參考。 您應該使它成為指針數組:

NotCopyable a(1, 2);

// incorrect:
vector<NotCopyable> v;
v.push_back(a);

// correct:
vector<NotCopyable*> v2;
v2.push_back(&a);

希望這可以幫助 ;)

NotCopyable arr[] =
{
    NotCopyable(1, 0),
    NotCopyable(2, 3)
};

在編寫此代碼時,編譯器需要copy-constructor,因為它是copy-initialization 這就是為什么您會得到編譯錯誤的原因,因為copy-constructor被聲明為private ,因此無法從外部訪問它。 但是,如果您在public部分中定義它,則它可以工作,但是不會調用copy-constructor,這是由於編譯器進行了優化。 該規范允許編譯器在這種情況下取​​消對復制構造函數的調用,但是它仍然僅需要可訪問的復制構造函數來進行代碼的語義檢查。 一旦完成語義檢查,它實際上就不會被調用!

暫無
暫無

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

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