2009-02-17 2 views
5

У меня есть класс C++, скажем, это называется с, и я хочу использовать неявный конструктор копирования в одном из способов, как это:Использования «это» в качестве параметра конструктора копии

c c::do_something() { 
    c copy = this; //I want implicit copy constructor here! 
    copy.something_else(); 
    //........// 
    return copy; 
} 

Тем не менее, GCC возвращает эту ошибку:

error: invalid conversion from 'c* const' to 'long unsigned int'

(у меня есть еще один конструктор из давно неподписанных INT присутствует)

... как если бы конструктор копирования не существует. Что я делаю не так?

ответ

20

это является указатель на объект таким образом это должно быть

c copy = *this; 
+0

ОК ... да, это все, по-видимому. thanks :) – 2009-02-17 00:12:17

+0

Это действительно использует конструктор по умолчанию, а затем оператор присваивания, * не * конструктор копирования. См. Ответ Мэтта. –

+0

Эндрю: Я не уверен - Джош ниже (и некоторые сайты) говорит обратное – 2009-02-17 00:58:27

4

Вау Вау! Кроме того, не путайте конструктор копирования и оператор присваивания копии.

c copy (*this); 

- конструктор копирования;

c copy = *this; 

является оператором присваивания копий. Любой из них будет работать, хотя конструктор копирования технически более эффективен, хотя оператор присваивания копий часто оптимизирован, чтобы делать то же самое.


Wow - я считаю себя исправленным. Использование оператора = в том же самом заявлении, что и объявление переменной, действительно вызывает конструктор копирования. Ты узнаешь что-то новое каждый день!

+0

No-c copy (* this); идентична c copy = * this; (при условии, что * это тип c) оба вызова конструктора копирования. c копия; copy = * this; вызывает конструктор по умолчанию, а затем оператор присваивания. – Eclipse

+0

Это не просто вопрос эффективности ... конструктор копирования и оператор присваивания могут быть совершенно разными функциями. –

6

В стороне, но это не будет вписываться в комментарий, и, похоже, есть некоторые разногласия. Попробуйте этот фрагмент кода, чтобы понять, когда вызываются копии-конструкторы и операторы присваивания:

class A 
{ 
public: 
    A() { cout << "A::A()\n"; } 
    A(const A &) { cout << "A::A(const A &)\n"; } 
    void operator =(const A &) { cout << "A::operator=(const A &)\n"; } 
}; 

int main() 
{ 
    A a; // default constructor 
    A copy = a; // copy constructor (and no assignment operator) 
    A copy2(a); // copy constructor (and no assignment operator) 
    a = copy; // assignment operator 
    A function(); // declares a function return A 
    A b = A(); // default constructor (but no assignment operator) 
    A b2 = A(a); // copy constructor (but no assignment operator) 
} 
+0

Для полноты может возникнуть идея добавить конструктор «A (int)», а затем показать, что «A a = 10;» эквивалентно: «A a (A (10))». –

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