在C ++中,具有const数据成员的类可以没有复制赋值运算符吗?

迪米特里耶·科斯蒂奇(Dimitrije Kostic)

我正在设计一个类,该类应具有名为的const数据成员K我也希望该类具有一个复制赋值运算符,但是编译器似乎会从任何具有const数据成员的类中隐式删除该复制赋值运算符。此代码说明了基本问题:

class A
{
    private:
       const int K;
    public:
       A(int k) : K(k) {} // constructor
       A() = delete; // delete default constructor, since we have to set K at initialization

       A & operator=(A const & in) { K = in.K; } // copy assignment operator that generates the error below
}

这是它生成的错误:

constructor.cpp:13:35: error: cannot assign to non-static data member 'K' with const- 
qualified type 'const int'
            A & operator=(A const & in) { K = in.K; }
                                          ~ ^
constructor.cpp:6:13: note: non-static data member 'K' declared const here
            const int K;
            ~~~~~~~~~~^
1 error generated.

我想我知道为什么编译器会这样做。我想要复制到的类的实例必须先存在,然后才能复制到K该对象,并且如果它是const,则不能在该目标实例中分配给它,就像我在上面尝试的那样。

我对这个问题的理解正确吗?如果是这样,是否有解决此问题的方法?也就是说,我可以为我的类定义一个复制构造函数,并且仍然提供K类似const的保护吗?

约翰菲洛

在C ++中,具有const数据成员的类可能具有复制构造函数。

#include <iostream>

class A
{
private:
    const int k_;
public:
    A(int k) : k_(k) {}
    A() = delete;
    A(const A& other) : k_(other.k_) {}

    int get_k() const { return k_; }
};

int main(int argc, char** argv)
{
    A a1(5);
    A a2(a1);

    std::cout << "a1.k_ = " << a1.get_k() << "\n";
    std::cout << "a2.k_ = " << a2.get_k() << "\n";
}

输出:

a1.k_ = 5
a2.k_ = 5

在C ++中,具有const数据成员的类不能使用默认的赋值运算符。

class A
{
private:
    const int k_;
public:
    A(int k) : k_(k) {}
    A() = delete;
    A(const A& other) : k_(other.k_) {}

    int get_k() const { return k_; }
};

int main(int argc, char** argv)
{
    A a1(5);
    A a2(0);

    a2 = a1;
}

产生编译时错误:

const_copy_constructor.cpp: In function ‘int main(int, char**)’:
const_copy_constructor.cpp:18:10: error: use of deleted function ‘A& A::operator=(const A&)’
   18 |     a2 = a1;
      |          ^~
const_copy_constructor.cpp:1:7: note: ‘A& A::operator=(const A&)’ is implicitly deleted because the default definition would be ill-formed:
    1 | class A
      |       ^
const_copy_constructor.cpp:1:7: error: non-static const member ‘const int A::k_’, can’t use default assignment operator

在C ++中,具有const数据成员的类可以使用非默认的赋值运算符,只要您不尝试更改const数据成员,但是您最好认真思考一下,如果其中之一是使用此赋值运算符意味着什么基础成员不能被修改。

class A
{
private:
    const int k_;
public:
    A(int k) : k_(k) {}
    A() = delete;
    A(const A& other) : k_(other.k_) {}

    A& operator=(A const& other)
    {
        // do nothing
        return *this;
    }

    int get_k() const { return k_; }
};

int main(int argc, char** argv)
{
    A a1(5);
    A a2(0);

    a2 = a1;
}

不产生编译时错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有赋值运算符的类的C ++深层复制

来自分类Dev

C ++中具有self的复合赋值运算符

来自分类Dev

C ++中具有self的复合赋值运算符

来自分类Dev

C ++运算符=类成员中具有互斥量

来自分类Dev

C ++运算符=类成员中具有互斥量

来自分类Dev

C ++复制赋值运算符类

来自分类Dev

C ++-具有派生类的“安全/标准”方法“继承”基类中的重载赋值运算符

来自分类Dev

在C ++中的纯静态公共接口上删除复制/赋值运算符有意义吗?

来自分类Dev

C ++-没有复制构造函数或赋值运算符的数组操作

来自分类Dev

具有函数运算符的C ++数组类,用于赋值

来自分类Dev

具有函数运算符的C ++数组类,用于赋值

来自分类Dev

具有非类型参数的 C++ 模板类:如何重载赋值运算符?

来自分类Dev

C ++:具有不同数据类型的赋值运算符的名称是什么

来自分类Dev

没有返回值的C ++类成员运算符定义

来自分类Dev

为什么没有用户定义的运算符的类中的c样式数组=支持深度复制

来自分类Dev

为什么没有用户定义的运算符的类中的c样式数组=支持深度复制

来自分类Dev

具有const数据成员的类的std :: move和rvalue赋值运算符

来自分类Dev

C#nameof运算符可以引用没有实例的实例属性吗?

来自分类Dev

C ++中带有.hpp和.cpp的模板类运算符没有匹配功能

来自分类Dev

C ++赋值运算符中的矩阵类

来自分类Dev

C ++-没有自定义交换功能的移动赋值运算符?

来自分类Dev

具有按位运算符的C ++中的算法

来自分类Dev

C ++中没有匹配“运算符”的错误

来自分类Dev

C ++中具有不同数据类型的二进制运算符重载

来自分类Dev

有没有一种方法可以在C#中定义隐式运算符,该隐式运算符定义从Expression到选定类的转换

来自分类Dev

外部C结构的C ++默认复制/移动赋值运算符不是const

来自分类Dev

在C中评估赋值运算符的左操作数有什么意义?

来自分类Dev

在C ++中的类中使用'const'和运算符重载是否有一个好的规则?

来自分类Dev

在C ++中的类中使用'const'和运算符重载是否有一个好的规则?

Related 相关文章

  1. 1

    带有赋值运算符的类的C ++深层复制

  2. 2

    C ++中具有self的复合赋值运算符

  3. 3

    C ++中具有self的复合赋值运算符

  4. 4

    C ++运算符=类成员中具有互斥量

  5. 5

    C ++运算符=类成员中具有互斥量

  6. 6

    C ++复制赋值运算符类

  7. 7

    C ++-具有派生类的“安全/标准”方法“继承”基类中的重载赋值运算符

  8. 8

    在C ++中的纯静态公共接口上删除复制/赋值运算符有意义吗?

  9. 9

    C ++-没有复制构造函数或赋值运算符的数组操作

  10. 10

    具有函数运算符的C ++数组类,用于赋值

  11. 11

    具有函数运算符的C ++数组类,用于赋值

  12. 12

    具有非类型参数的 C++ 模板类:如何重载赋值运算符?

  13. 13

    C ++:具有不同数据类型的赋值运算符的名称是什么

  14. 14

    没有返回值的C ++类成员运算符定义

  15. 15

    为什么没有用户定义的运算符的类中的c样式数组=支持深度复制

  16. 16

    为什么没有用户定义的运算符的类中的c样式数组=支持深度复制

  17. 17

    具有const数据成员的类的std :: move和rvalue赋值运算符

  18. 18

    C#nameof运算符可以引用没有实例的实例属性吗?

  19. 19

    C ++中带有.hpp和.cpp的模板类运算符没有匹配功能

  20. 20

    C ++赋值运算符中的矩阵类

  21. 21

    C ++-没有自定义交换功能的移动赋值运算符?

  22. 22

    具有按位运算符的C ++中的算法

  23. 23

    C ++中没有匹配“运算符”的错误

  24. 24

    C ++中具有不同数据类型的二进制运算符重载

  25. 25

    有没有一种方法可以在C#中定义隐式运算符,该隐式运算符定义从Expression到选定类的转换

  26. 26

    外部C结构的C ++默认复制/移动赋值运算符不是const

  27. 27

    在C中评估赋值运算符的左操作数有什么意义?

  28. 28

    在C ++中的类中使用'const'和运算符重载是否有一个好的规则?

  29. 29

    在C ++中的类中使用'const'和运算符重载是否有一个好的规则?

热门标签

归档