如何处理运算符=中的常量成员?



我有一个包含一些常量成员的类,我想实现operator=但我无法为常量成员赋值。

class A {
public:
const int value;
A(int v) : value(v) {}; 
A& operator=(const A& a);
};

如何实施operator=

我可以实现复制构造函数并从operator=调用它,这是唯一的解决方案吗?

原始类的设计者决定不支持operator=(),您不应该尝试实现它。

但是,我怀疑您要实现它的原因是因为您在另一个类中使用它,并且您想为该类实现operator=()

如果这是真的,我会通过指针(或智能指针(持有A并重新分配指针,而不是尝试在A上调用operator=()

你必须决定什么样的语义对你有意义。

附录:我添加这一部分是为了解释一些我认为你可能不了解C++的事情。

从你的问题中A

此代码构造一个A

A a(3);

如果你有一个复制构造函数,这将调用它

A b(a);

这也会如此

A b = a;

上面的这一行不是operator=()- 它是复制构造函数的替代语法。

现在,这就是我们使用operator=()

A a(4);
A b(5);
b = a; // <--- calls operator=()

现在,如果b有一个需要更改的 const 成员变量,这怎么可能工作?

它不能,但是....

A a(4)
A b(5)
A* aPtr = &a;
aPtr = &b; // this is ok

因此,如果您需要引用一个A和一个点,然后您需要稍后引用不同的A- 使用指针(或包装器,或智能指针(

const变量有点矛盾。它们是只读的,如果没有一些巫毒魔法和一些指针洗牌,通常无法更改。 无论如何,value是私有的(编辑:现在protected(,因此如果没有类中的某种公共函数,就无法更改它。只需声明为常规int.

class A {
protected:
int value;   
public:
A(int v) //public constructor
{ 
value = v; 
}
A& operator=(const A& a) //public operator override
{
if(&a == this) //check for self assignment
return *this;
//do actual assignment
value = a.value;
return *this;
}
};

最新更新