2015-02-24 6 views
0

Я писал эту программу, где я определил class X и вручную определил ее конструкторы и деструктор, чтобы я мог иметь оператор печати в каждом из них и видеть, когда они вызываются.Определение моего собственного конструктора копирования

Однако проблема связана с моим определением конструктора копирования.

Это дает следующее сообщение об ошибке:

warning: passing const X as this argument of int X::getI() discards const

Что является причиной этой ошибки?

Фрагмент кода класса:

class X { 
    public: 
     X() { 
      cout << "Default Constructor called\n"; 
      i = 0; 
     } 
     X(int i) { 
      cout << "Parameterized Constructor called\n"; 
      this->i = i; 
     } 
     X(const X& x) { 
      cout << "Copy Constructor called\n"; 
      i = x.getI(); 
     } 
     ~X() { 
      cout << "Destructor called\n"; 
     } 
     int getI() { 
      return i; 
     } 
    private: 
     int i; 
}; 
+0

Он компилируется без ошибок, если я удалить сопзЬ из аргумента конструктора копирования. –

+0

Аргумент конструктора копирования должен быть действительно 'const'. Проблема в том, что 'getI' - нет. – 5gon12eder

+0

@ 5gon12eder: Хорошо, но почему конструктор копирования имеет const? –

ответ

3

Вы пытаетесь вызвать не- функцию const члена getI через const ссылки. Это запрещено. Поскольку getI не изменяет объект this, он должен быть объявлен как const.

int 
getI() const 
{ 
    return this->i; 
} 

Тогда вы будете в состоянии назвать его даже через const ссылки.

+0

Итак, могут ли ссылки или объекты const ссылаться только на функции const? –

+0

Да, поскольку вызов с помощью ссылки 'const' передает указатель' const' 'this' и при преобразовании указателя неконверсии в указатель' const' является неявным преобразованием, противоположное направление недопустимо (если вы не используйте действительно уродливый 'const_cast'). Если вы думаете об этом, это имеет смысл: вы всегда можете сделать * дополнительное обещание не изменять что-то, но вы никогда не сможете отступить от обещания, которое вы уже сделали. – 5gon12eder

1

getI() не const участник функция. Вы не можете называть его объектами const. В конструкторе копирования x является объектом const. Таким образом, вы не можете назвать

x.getI(); 

Изменение getI() функционировать в const члена.

int getI() const { 
     return i; 
    } 
0
#include <iostream> 

using namespace::std; 


class X { 
    public: 
     X() { 
      cout << "Default Constructor called\n"; 
      i = 0; 
     } 


     X(int i) { 
      cout << "Parameterized Constructor called\n"; 
      this->i = i; 
     } 
     X(const X& x) { 
      cout << "Copy Constructor called\n"; 
      i = x.getI(); 
     } 
     ~X() { 
      cout << "Destructor called\n"; 
     } 
     int getI() const { 
      return i; 
     } 
    private: 
     int i; 
}; 

int main() 
{ 
} 

Вот правильный код, у вас сделать Geti константным

+1

Спасибо, Ахил. –

Смежные вопросы