Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;重写运算符和此_C++ - Fatal编程技术网

C++ c++;重写运算符和此

C++ c++;重写运算符和此,c++,C++,我想重写“=”运算符,但我有一个问题,该类有一个常量成员,我想在使用“=”时更改它,我想解构该对象并构造一个新对象可能有效,但“this”不能更改。因此,您能帮我吗?您可以标记要更改的成员mutable。这就是关键字的用途 当然,您可能违反了与类用户的隐式约定,operator=不会修改类…您可以使用pimpl习惯用法。例如: class Foo_impl { public: Foo(int x, int y, int z) :x_(x), y_(y), z_(z)

我想重写“=”运算符,但我有一个问题,该类有一个常量成员,我想在使用“=”时更改它,我想解构该对象并构造一个新对象可能有效,但“this”不能更改。因此,您能帮我吗?

您可以标记要更改的成员
mutable
。这就是关键字的用途


当然,您可能违反了与类用户的隐式约定,
operator=
不会修改类…

您可以使用pimpl习惯用法。例如:

class Foo_impl
{
public:
    Foo(int x, int y, int z)
        :x_(x), y_(y), z_(z)
    {}
    const int x_;
    int y_,z_;
};

class Foo
{
public:
    Foo(int x, int y, int z)
        :impl_(new Foo_impl(x,y,z))
    {}    

    Foo & operator=(Foo rhs)
    {
        swap(rhs);
        return *this;
    }

    void swap(Foo & rhs)
    {
        std::swap(impl_, rhs.impl_);
    }

    // still need copy constructor
private:
    std::unique_ptr<Foo_impl> impl_;
};
class Foo\u impl
{
公众:
Foo(整数x,整数y,整数z)
:x_ux,y_ux,z_z
{}
常数int x_2;;
int y_uuz;
};
福班
{
公众:
Foo(整数x,整数y,整数z)
:impl_(新Foo_impl(x,y,z))
{}    
Foo&运算符=(Foo-rhs)
{
掉期(rhs);
归还*这个;
}
无效掉期(Foo和rhs)
{
标准::交换(impl_uu,rhs.impl_uu);
}
//还需要复制构造函数吗
私人:
std::唯一\u ptr impl;
};

但我真的不明白这有什么意义。

事实上,我只想用“=”将一个对象的const成员复制到另一个对象。我想知道如何使用解构器和构造函数来实现它。@TonyWen:您可以显式调用析构函数,然后使用placement
new
,但这并不是例外安全的。我想简单地不标记成员const不是一个选项?为什么不呢?