2014-09-01 2 views
-2

Я понял концепцию конструкторов копирования, которые мы делаем указателем, имеет разные местоположения и указывает на одно и то же значение.C++ special member copy constructor

Но мне интересно, почему, когда я пытаюсь получить доступ к значению для переменной объекта, его значение отличается от значения другого.

Например:

#include <iostream.h> 
using namespace std; 

class myclass { 
public: 
    int a, b; 
    string c; 
}; 

int main() 
{ 
    myclass foo, bar; 
    foo = bar; 
    bar.a = 20; 
    cout << foo.a << endl; // why it is not printing 20 here, as implicit copy 
          // constructor copy all members from object bar 
          // to object foo? 
} 
+1

Потому что вы скопировали перед установкой этого члена. – Till

+7

* «Я понял концепцию конструкторов копирования» *, Нет, вы не сделали :( –

+2

Вы получите только указатели, указывающие на один и тот же объект, когда у вас есть указатели. Здесь нет указателей, всего два отдельных объекта. Изменение одного объекта не изменит другого. –

ответ

0

Конструктор копирования не передает ссылку или указатель a на новый объект, он копирует значение этого примитивного целого числа. Для достижения желаемого результата (который в вашем примере я предполагаю присвоить значение a после копирования вашего объекта), вы должны реструктурировать свой класс, чтобы a был указателем целым числом. Рассмотрим следующий пример:

class myclass 
{ 
    int *a, *b; 
    string c; 
    myclass() 
    { 
     a = new int; 
     b = new int; 
    } 
}; 

int main() 
{ 
    myclass foo, bar; 
    foo = bar; 
    *bar.a = 20; 
    cout << foo.a << endl; 
} 

Это вызовет адрес, который будет содержать «20», который будет принят во время строительства копии. Теперь, когда a правильно установлен, он будет отражен в обоих объектах.
Этот ответ приходит с отказом от ответственности, что я бы не счел это лучшей практикой, и в конечном итоге я призываю вас пересмотреть свой дизайн.

0

почему здесь не печатает 20, как неявное копирование constructpr копирования всех членов от объекта панели объекта Foo/

Тех членов имеет конструктор копирования и операторы присваивания, перегруженные (или встроенные), а также при выполнении задания:

foo=bar; 

тогда все участники от bar присваиваются копиям в соответствующие поля в foo, и ни int, ни std::string не имеют никакого отношения к экземплярам, ​​из которых они были инициализированы. Также обратите внимание, что здесь вы не вызываете никаких копий-constuctor, а перегруженных операторов присваивания (operator=).