【问题标题】:What does prohibiting value semantics in C++ mean?在 C++ 中禁止值语义是什么意思?
【发布时间】:2023-03-05 10:31:02
【问题描述】:

我有以下代码:

template<typename T>
class derClass : public baseClass<column<T>, column<k>>
{
      //prohibit value semantics
      derClass(const derClass&) = delete;
      derClass& operator= (const derClass&) = delete;

   public:
      ...
}

这段代码有很多地方看不懂:

  1. 这些delete 是什么意思?我没有看到 delete 变量的任何声明。
  2. 为什么我们需要一个将同一类的对象作为参数的构造函数?
  3. 这整行是什么意思:derClass&amp; operator= (const derClass&amp;) = delete;

【问题讨论】:

    标签: c++ syntax constructor semantics delete-operator


    【解决方案1】:

    这里的deletenew C++11 thing,告诉编译器这些方法不存在。否则编译器会创建它们的默认版本。

    获取自身类的常量引用的构造函数是复制构造函数。复制构造函数的用途应在任何有关 C++ 的初学者文本中进行说明。

    由于现在删除了复制构造函数和复制赋值运算符,这意味着您无法从derClass 的另一个实例创建derClass 的实例。

    【讨论】:

      【解决方案2】:

      你看到的东西是用来禁用复制构造函数的。

      有关详细信息,请参阅: What's the most reliable way to prohibit a copy constructor in C++?

      【讨论】:

        【解决方案3】:

        值语义是当您的对象表现得像值时:当您将它分配给另一个对象时,第二个对象将具有相同的值,当您首先更改时,第二个对象保持不变。另一种情况是引用语义——当你第一次改变时——第二次改变。

        构造函数,取同一个类的引用是复制构造函数,它只是复制对象。第二个定义是赋值运算符。当您将它们标记为 delete 时 - 无法复制和分配您的对象。

        【讨论】:

          【解决方案4】:
          1. C++11 语法本质上表示“此类没有 X”,其中 X 首先是复制构造函数,其次是复制赋值运算符。
          2. 它是一个复制构造函数。这在任何 C++ 入门书籍中都有解释。
          3. 它是一个复制赋值运算符。这在任何 C++ 入门书籍中都有解释。

          总的来说,使用这些deleted 特殊函数意味着您不能复制该类的实例,或复制分配给它们:

          derClass d1, d2;
          derclass d3{d1}; // ERROR: cannot copy
          d2 = d1;         // ERROR: cannot copy-assign
          

          【讨论】:

            猜你喜欢
            • 2018-04-11
            • 2010-09-15
            • 2011-08-27
            • 2018-05-12
            • 1970-01-01
            • 2011-08-01
            • 1970-01-01
            • 2018-12-18
            • 1970-01-01
            相关资源
            最近更新 更多