C++错误:将"const"作为"this"数组传递

C++ error: Passing 'const' as 'this' array

本文关键字:this 数组 作为 const 错误 C++      更新时间:2023-10-16

Dev C++下编译时得到passing 'const Array' as 'this' argument of 'int& Array::operator[](int)' discards qualifiers。如果我在cygwin上使用gcc编译,我会收到一些这种类型的错误消息:

 error: extra qualification ‘Array::’ on member ‘Array’ [-fpermissive]

你能告诉我这个错误的原因是什么吗?我在这个代码上花了很多时间,但仍然无法使它正常工作。

#include<iostream>
using namespace std;
class Array
{
      int *m_ptr;
      int m_size;
      public:
             Array(int sz)
             {
                       cout<<"constructorn";
                       m_size = sz;
                       m_ptr = new int[sz];
             }
             ~Array()
             {
                     cout<<"Deleten";
                     delete[] m_ptr;
             }
             int& operator[] (int j)
             {
                  cout<<"Operation []n";
                  return m_ptr[j];
             }
             void Array::copy(const Array& ar)
             {
                  m_size = ar.m_size;
                  m_ptr = new int[m_size];
                  int *ptr = ar.m_ptr;
                  int j;
                  for(j = 0;j < m_size; j++)
                  m_ptr[j] = ptr[j];
             }
             Array::Array(const Array& ar)
             {
                                copy(ar);
             }
             void Array::print(const Array& ar)
             {
                  int i;
                  int len = ar.m_size;
                  for(i = 0;i < len;i++)
                  cout<<ar[i]<<"  ";
                  cout<<endl;
             }
};
int main()
{
    Array a1(10);
    Array a2(5);
    int i;
    for(i = 0;i < 10;i++)
    {
          a1[i] = 1;
          if(i < 5) a2[i] = 2;
    }
    print(a1);
    return 0;
}

此外,我正在读的书也有功能

Array& operator= (const Array& ar) 
{ 
   delete m_ptr; 
   copy(ar); 
   return *this; 
}

我不明白为什么我们需要使用这个功能。

只需更改

void Array::copy(const Array& ar)

void copy(const Array& ar)

只有出现在类声明之外的函数定义才需要类作用域限定符。

问题1

中不需要Array::

void Array::copy(const Array& ar) { ... }

当函数在类定义中定义时。它可以简单地是

void copy(const Array& ar) { ... }

只有当函数在类定义之外定义时,才需要Array::部分。

第2期

print中,您有一行:

              cout<<ar[i]<<"  ";

由于arconst对象,而operator[]()函数不是const成员函数,编译器不喜欢它。您应该提供operator[]函数的两个重载——一个用于const对象,另一个用于非const对象。

int& operator[] (int j)
{
   return m_ptr[j];
}
int operator[] (int j) const
{
   return m_ptr[j];
}

然后,您可以使用数组运算符访问const对象的元素,也可以访问和修改非const对象的元素。