Инициализация ссылок на элементы данных с использованием списков инициализации в C ++ - PullRequest
2 голосов
/ 09 августа 2011

Укладчики,

Рассмотрим следующие два простых класса в заголовочном файле:

Class CC
{
 public:
 CC(int& value);
 C& operator=(const C& other);
 {
   cout<<" From copy constructor ";
 }

 int m_cc;
};

Class AA
{
 public:
 AA( CC& refCC);

 CC m_cInstance;
}

В файле .cpp содержится следующее.

CC:CC(int& value): m_cc(value)
{
   cout<<" Constructor of CC" <<endl;
   m_cc++;
}

AA:AA(CC& refCC): m_cInstance(refCC)
{
   cout<<" The value of m_cc in refCC is: "<< refCC.m_cc; 
   cout<<" The address of m_cc in refCC is: "<< &refCC.m_cc;
   cout<<" The address of refCC is: "<< &refCC;

   cout<<" The value of m_cc in m_cInstance is: <<m_cInstance.m_cc;
   cout<<" The address of m_cc in m_cInstance is: <<&m_cInstance.m_cc;
   cout<<" The address of m_cInstance is: <<&m_cInstance;
}

Я использую два выше объявленных простых класса следующим образом в моем файле main.cpp:

int cvalue = 1000; СС refCC (cvalue);

AA aaObj (refCC);

Вот вывод программы:

 Constructor of CC
 The value of m_cc in refCC is: 1001
 The address of m_cc in refCC is: 0x12ff20
 The address of refCC is: 0x12ff20

 The value of m_cc in m_cInstance is: 1001
 The address of m_cc in m_cInstance is: 0x12ff14
 The address of m_cInstance is: 0x12ff14

Вот несколько замечаний:

  1. Обратите внимание, что адрес m_cInstance в экземпляре AA отличается от адреса refCC.

  2. Хотя экземпляр CC передается по ссылке (refCC) в конструкторе AA, переменная-член "m_cInstance" сама по себе является отдельным экземпляром.

  3. Конструктор экземпляра для CC вызывается один раз, когда создается refCC, даже если в программе присутствуют два разных экземпляра CC, которые имеют одно и то же состояние.

  4. Переопределенный оператор присваивания никогда не вызывается.

Мой вопрос прост:

Как создается m_cInstance в конструкторе AA без вызова конструктора CC или оператора присваивания, определенного в CC ??

А если CC содержит дескриптор файла на диске в качестве переменной-члена? Каково его поведение в "m_cInstance" ??

Спасибо

Де Косто.

Ответы [ 3 ]

2 голосов
/ 09 августа 2011

m_cInstance создается с помощью (предоставленного в вашем случае компилятора) конструктора копирования.В качестве проверки работоспособности, если вам нужно определить оператор присваивания, вам, вероятно, нужно определить также конструктор копирования и деструктор (как правило, три здесь и в Википедии )

0 голосов
/ 09 августа 2011

есть конструктор копирования, который предоставляется вашему классу (компилятором), и если я правильно понимаю, вы, вероятно, путаете operator=(const C& other), который вы определили с конструктором копирования.

Для class CC конструктор копирования будет иметь такое объявление

CC(const CC& C);

0 голосов
/ 09 августа 2011

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

...