簡體   English   中英

如果 class 有一個 const 變量,為什么我可以將一個 object 復制到另一個 object 中?

[英]why am I able to copy one object into other object if the class has a const variable?

根據 cppreference 文檔:

如果以下任何條件為真,則 class T 的隱式聲明或默認復制構造函數被定義為已刪除:

  • T 具有不可復制的非靜態數據成員(具有已刪除、不可訪問或不明確的復制構造函數);

我在我的Demo class 中使用了一個const變量,所以我希望obj1不應該復制到obj2中,因為我們有一個const變量,如下例所示:

#include <iostream>
using namespace std;

class Demo
{
public:
  const int val = 100;//nonstatic data member that cannot be copied
  Demo(){}    
};

int main()
{
    Demo obj1;
    Demo obj2(obj1);
    std::cout << "obj1.val :" << obj1.val << std::endl;
    std::cout << "obj2.val :" << obj2.val << std::endl;
    return 0;
}

Output:

obj1.val : 100
obj2.val : 100

為什么將obj1復制到obj2中? 根據 cppreference 文檔:

“如果您有無法復制的非靜態數據成員,則隱式聲明的復制構造函數已刪除”

為什么obj1復制到obj2 根據 cppreference 文檔“隱式聲明的復制構造函數已刪除

因為隱式聲明的復制Demo::Demo(const Demo&)實際上並未在給定代碼中刪除,因為可以復制const數據成員val


那么你能告訴我任何我們不能僅僅為了理解這一點而復制的數據成員示例嗎?

這是一個人為的例子,其中復制Demo::Demo(const Demo&)隱式刪除,因為無法復制 const 數據成員val

class DeletedCopy
{
    public:
        DeletedCopy(const DeletedCopy&) = delete;//delete the copy ctor
        DeletedCopy() = default;
};
class Demo
{
public:
  const DeletedCopy val{};
  Demo(){}

};

int main()
{
    Demo obj1;
    Demo obj2(obj1);//this won't work now as copy ctor Demo::Demo(const Demo&) is implicitly deleted.
    return 0;
}

演示

1. 你最初的問題:

為什么obj1被復制到obj2

因為擁有const成員並不意味着它不能被復制。 const只是意味着一旦成員被初始化,它就不能被修改。

2.您在評論中的問題:

你能告訴我任何我們不能僅僅為了理解這一點而復制的數據成員示例嗎?

您需要添加一個不可復制的成員,以便刪除“隱式聲明的復制構造函數”
一個例子是std::mutex

以下代碼產生以下錯誤消息:

#include <mutex>

class Demo
{
public:
    std::mutex val;
};

int main()
{
    Demo obj1;
    Demo obj2(obj1);  // <---- error below on this line
    return 0;
}

錯誤信息(MSVC):

error C2280: 'Demo::Demo(const Demo &)': attempting to reference a deleted function

旁注:最好避免using namespace std - 請參閱此處為什么“使用命名空間標准;” 被認為是不好的做法? .

暫無
暫無

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

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