C++ 常量成员函数在这种形式下是如何工作的?

C++ 常量成员函数在这种形式下是如何工作的?,c++,constants,C++,Constants,我想知道常量成员函数在这种情况下是如何工作的 自定义数组类: class Array { private: int m_size; int *m_ptr; // Utility function void set_size( int size ); // Set size of array public: // Constructors Array( int array_size ); // Default constructor Ar

我想知道常量成员函数在这种情况下是如何工作的

自定义数组类:

class Array
{
private:
    int m_size;
    int *m_ptr;

    // Utility function
    void set_size( int size ); // Set size of array

public:
    // Constructors
    Array( int array_size ); // Default constructor
    Array( const Array &copy_array ); // Copy constructor

    // Destructor
    ~Array() { delete [] m_ptr; };

    int get_size() const { return m_size; }; // Get size of array

    // Overloaded Operators
    const Array &operator=( const Array &rhs );
}


const Array &Array::operator=( const Array &rhs )
{
    if( this != &rhs )
    {
        if( this -> get_size() != rhs.get_size() )
        {
            delete [] m_ptr;
            set_size( rhs.get_size() );
            m_ptr = new int[ get_size() ];
        }

        for( int i = 0; i < get_size(); i++ )
        {
            this -> m_ptr[i] = rhs.m_ptr[i];
        }
    }

    return *this;
}
类数组
{
私人:
国际货币单位大小;
int*m_ptr;
//效用函数
void set_size(int size);//设置数组大小
公众:
//建设者
数组(int数组_大小);//默认构造函数
数组(const数组和copy_数组);//复制构造函数
//析构函数
~Array(){delete[]m_ptr;};
int get_size()常量{return m_size;};//获取数组的大小
//重载运算符
常量数组和运算符=(常量数组和rhs);
}
常量数组和数组::运算符=(常量数组和rhs)
{
如果(此!=&rhs)
{
如果(此->获取大小()!=rhs.获取大小())
{
删除[]m_ptr;
设置大小(rhs.get_size());
m_ptr=newint[get_size()];
}
对于(int i=0;im_ptr[i]=rhs.m_ptr[i];
}
}
归还*这个;
}

我想知道重载的“=”运算符如何首先声明常量?因为成员函数会更改当前对象的值。如果你使用这个函数,你可以在赋值后改变对象的值,只要当前对象本身不是常数。所以我想知道这样声明函数常数有什么意义?

在我看来,这要么是打字错误,要么是设计错误。返回引用不应包含常量限定符

Array &Array::operator=( const Array &rhs )
{
//...
}

有一种观点认为,
操作符=
应该返回一个常量引用,以防止像
(a=b)=c这样的代码编译。这种观点在C++早期是比较常见的,因为C不允许构造,人们希望C++以相同的方式运行。这几天很少见。

是的,我不明白你为什么要这样做。这是书中的一个例子。@anacy经常在书中出现打字错误。在出版一本书之前,很难测试书中所有的例子。