Назначение и инициализация 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 не копирует.