سؤال

لدي قاعدة رمز ، حيث يوجد في فئة المصفوفة () المشغل أو العامل:

template <class T> T& Matrix<T>::operator() (unsigned row, unsigned col)
{
    ......
}


template <class T> T Matrix<T>::operator() (unsigned row, unsigned col) const
{
    ......
}

شيء واحد أفهمه هو أن الثاني لا يعيد المرجع ولكن ماذا يفعل const يعني في الإعلان الثاني؟ أيضا أي وظيفة تسمى عندما أقول mat(i,j)?

هل كانت مفيدة؟

المحلول

أي وظيفة تسمى تعتمد على ما إذا كان المثيل هو const أم لا. يتيح لك الإصدار الأول تعديل المثيل:

 Matrix<int> matrix;
 matrix(0, 0) = 10;

يسمح الحمل الزائد Const بالوصول للقراءة فقط إذا كان لديك مثيل CONST (مرجع) من المصفوفة:

 void foo(const Matrix<int>& m)
 {
     int i = m(0, 0);
     //...
     //m(1, 2) = 4; //won't compile
 }

والثاني لا يعيد مرجعًا لأن النية هي عدم السماح بتعديل الكائن (يمكنك الحصول على نسخة من القيمة وبالتالي لا يمكنك تعديل مثيل المصفوفة).

من المفترض أن يكون T نوعًا بسيطًا بسيطًا وهو رخيص (ER) للعودة بالقيمة. إذا كان T أيضًا نوعًا أكثر تعقيدًا من المعرفة من قبل المستخدم ، فسيكون من الشائع أيضًا أن تُرجع عمليات التحميل الزائدة إلى مرجع const:

 template <class T>
 class MyContainer
 {
      //..,
      T& operator[](size_t);
      const T& operator[](size_t) const;
 }

نصائح أخرى

سيتم استدعاء إصدار const على مصفوفات const. على المصفوفات غير الممتدة ، سيتم استدعاء الإصدار غير المؤلف.

Matrix<int> M;
int i = M(1,2); // Calls non-const version since M is not const
M(1,2) = 7; // Calls non-const version since M is not const

const Matrix<int> MConst;
int j = MConst(1,2); // Calls const version since MConst is const

MConst(1,2) = 4; // Calls the const version since MConst is const.
                 // Probably shouldn't compile .. but might since return value is 
                 // T not const T.

int get_first( const Matrix<int> & m )
{
   return m(0,0); // Calls the const version as m is const reference
}

int set_first( Matrix<int> & m )
{
  m(0,0) = 1; // Calls the non-const version as m is not const
}

أي وظيفة تسمى تعتمد على ما إذا كان الكائن const. ل const أشياء const يسمى الحمل الزائد:

const Matrix<...> mat;
const Matrix<...>& matRef = mat;
mat( i, j);//const overload is called;
matRef(i, j); //const overloadis called

Matrix<...> mat2;
mat2(i,j);//non-const is called
Matrix<...>& mat2Ref = mat2;
mat2Ref(i,j);//non-const is called
const Matrix<...>& mat2ConstRef = mat2;
mat2ConstRef(i,j);// const is called

الأمر نفسه ينطبق على المؤشرات. إذا تم إجراء المكالمة عبر مؤشر إلى كونست ، يتم استدعاء الحمل الزائد. وإلا فإن الحمل الزائد غير الممتاز يسمى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top