Поделиться через


Назначение и инициализация Memberwise

Методы по умолчанию назначения и инициализации "назначение memberwise" и "инициализация memberwise," соответственно.Назначение Memberwise состоит из копии одного объекта к другому, член одновременно, если присвоение каждый член по отдельности.Инициализация Memberwise состоит из копии одного объекта к другому, член одновременно, если инициализация каждый член по отдельности.Основным различием между 2, что назначение memberwise вызывающий оператор присваивания каждого члена (operator=), в то время как инициализация memberwise вызывает конструктор копии каждого элемента.

Назначение Memberwise выполняется только объявленным оператором присваивания в формате:

тип& тип :: (operator= [Const | volatile] тип& )

Операторы присваивания по умолчанию для назначения memberwise невозможно сформировать, если любое из следующих условий:

  • Класс члена есть Const члены.

  • Класс члена имеет члены ссылки.

  • Класс члена или свой базовый класс, имеют оператор присваивания (privateoperator=).

  • Базовый класс или класс элемента отсутствует оператор присваивания (operator=).

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

  • Класс члена есть Const члены.

  • Класс члена имеет члены ссылки.

  • Класс члена или свой базовый класс имеет закрытый конструктор копий.

  • Базовый класс или класс элемента отсутствует конструктор копий.

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

  • Класс не предоставляет определяемую пользователем функцию для этой копии.

  • Программа требует, чтобы функция присутствует.Это требование существует назначение или если инициализация обнаружены, требующих копирования memberwise или если адрес типа operator= функция выполняются.

При выполнении обоих из этих условий не выполняются, необходимо, чтобы компилятор создает код для операторов и функций конструктора копий по умолчанию назначения (исключением того кода оптимизация выполненная компилятором microsoft C++).В частности, если класс объявляет определяемое пользователем operator= принимает аргумент, ссылка на тип " имя классаоператор" нет разрешения по умолчанию не создается.Если класс объявляет конструктор копии, по умолчанию конструктор копии не создается.

Поэтому для данного класса Aвсегда присутствуют следующие объявления:

//  Implicit declarations of copy constructor
//   and assignment operator.
A::A( const A& );
A& A::operator=( const A& );

Определения предоставлены только при необходимости (согласно предыдущему критерию).Функции конструктора копии, показанная в предыдущем примере являются открытыми функции-членами класса.

Операторы присваивания по умолчанию позволяют объекты заданного класса для присвоения объектам открытого типа базового класса.Рассмотрим следующий код.

Пример

// spec1_memberwise_assignment_and_initialization.cpp

#include<stdio.h>

class Account
{
protected:
    int _balance;
public:
   int getBalance() 
   {
      return _balance;
   }
};

class Checking : public Account
{
private:
    int _fOverdraftProtect;
public:
    Checking(int balance, int fOverdraftProtect)
    {
        _balance = balance;
        _fOverdraftProtect = fOverdraftProtect;
    }
};

int main()
{
    Account account;
    Checking checking(1000, 1);
    account = checking;
    printf_s("Account balance = %d\n", account.getBalance());
}
  

Комментарий

В предыдущем примере выбранный оператор присваивания Account::operator=.Поскольку значение по умолчанию operator= функция принимает аргумент типа Account& (ссылка на Account) Account subobject checking копирует значение account; fOverdraftProtect не копирует.

См. также

Ссылки

Копирование объектов класса