繁体   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