Различное лечение для вызова по значению и присваиванию с использованием = operator [duplicate]

Очень хороший способ сделать это, помимо использования Java 7, - использовать перечисления. Объявить перечисление, как показано ниже

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

enum MyEnum
{
    val1("value < 4"),val2("4<value<6");
    private String value;

    private MyEnum(String value)
    {
        this.value = value;
    }
}


public static void chooseStrategy(MyEnum enumVal)
{   
    int value = getValue();
    switch(enumVal)
    {
        case val1:
        if(value > 2){}
        break;
        case val2:
        if(4 < value && value < 6) {}
        break;
        default:
    }
}

public static void main(String[] args)
{
    String str = "4<value<6";
    chooseStrategy(MyEnum.valueOf(str));
}

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

78
задан Cœur 6 March 2017 в 14:56
поделиться

7 ответов

Первая - это инициализация копирования, вторая - просто назначение. Нет конструктора присваивания.

A aa=bb;

использует созданный компилятором конструктор копий.

A cc;
cc=aa;

использует конструктор по умолчанию для построения cc, а затем * оператор присваивания ** (operator =) на уже существующий объект.

Я хочу знать, как выделить память конструктора присваивания и конструктора копирования?

IDK, что вы имеете в виду, выделяя память в этом случае, но если вы хочу узнать, что происходит, вы можете:

class A
{
public :
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

Я также рекомендую вам взглянуть на:

Почему вместо конструктора преобразования вызывается конструктор конструктора?

Что такое правило три?

18
ответ дан Community 16 August 2018 в 02:38
поделиться
  • 1
    Просто примечание. В настоящее время (C ++ 11 onward) они могут быть явно дефолты с помощью =default;. – Deduplicator 18 July 2014 в 18:16
  • 2
    @Deduplicator Также важно отметить, что при соблюдении классификаций, требующих тривиальных конструкторов, вы должны = default им, где необходим ctor по умолчанию: простое выполнение пустого тела по-прежнему считается пользователем -определенный ctor и, следовательно, (на уровне Standardese) не является тривиальным и дисквалифицирует тип от классификаций, требующих тривиального ctor. – underscore_d 12 July 2016 в 13:26
  • 3
    @sbi Могу ли я сказать, что если конструктор копирования не используется и вместо этого используется оператор присваивания, объект создается первым, вызывая конструктор либо с аргументами, либо без аргументов, а затем используется оператор присваивания и назначаются новые значения на основе RHS. В случае использования конструктора копирования будет вызываться тот же самый конструктор, но значения, используемые для инициализации, относятся к другому объекту. – Rajesh 17 March 2018 в 04:40
  • 4
    @Rajesh: Я смущен тем, что вы просите, и я чувствую, что это потому, что вы тоже смущены. :) Попробуете ли вы еще раз объяснить, о чем вы говорите? – sbi 17 March 2018 в 22:03

Простыми словами,

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

Пример -

t2 = t1;  // calls assignment operator, same as "t2.operator=(t1);"
Test t3 = t1;  // calls copy constructor, same as "Test t3(t1);"
1
ответ дан Dev 16 August 2018 в 02:38
поделиться

Что-то добавить о конструкторе копирования:

  • При передаче объекта по значению он будет использовать конструктор копирования
  • . Когда объект возвращается из функции по значению, он будет использовать конструктор копирования
  • При инициализации объекта, используя значения другого объекта (в качестве примера, который вы даете).
1
ответ дан Frank Shen 16 August 2018 в 02:38
поделиться

То, что @Luchian Grigore Said реализовано следующим образом

class A
{
public :
    int a;
    A(){ cout<<"default constructor"<<endl;};
    A(const A& other){ cout<<"copy constructor"<<endl;};
    A& operator = (const A& other){cout <<"assignment operator"<<endl;}
};

void main()
{
    A sampleObj; //Calls default constructor
    sampleObj.a = 10;

    A copyConsObj  = sampleObj; //Initializing calls copy constructor

    A assignOpObj; //Calls default constrcutor
    assignOpObj = sampleObj; //Object Created before so it calls assignment operator
}

OUTPUT


конструктор по умолчанию


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


конструктор по умолчанию


оператор присваивания


1
ответ дан Mak 16 August 2018 в 02:38
поделиться

Я хочу добавить еще одну тему в эту тему. «Операторная функция оператора присваивания должна быть записана только как функция-член класса». Мы не можем сделать это как функцию друга, в отличие от другого двоичного или унарного оператора.

2
ответ дан MD BELAL RASHID 16 August 2018 в 02:38
поделиться

разница между конструктором копирования и конструктором присваивания равна:

  1. В случае конструктора копии он создает новый объект. (<classname> <o1>=<o2>)
  2. В случае конструктора присваивания он не будет создавать никаких объектов, которые будут применяться к уже созданным объектам (<o1>=<o2>).

И основные функции в обоих случаях одинаковы, они будут копировать данные из o2-o1 член-член.

2
ответ дан SHAZ 16 August 2018 в 02:38
поделиться

Разница между конструктором копирования и оператором присваивания вызывает много путаницы для новых программистов, но это действительно не так уж сложно. Подведение итогов:

  • Если новый объект должен быть создан до того, как произойдет копирование, используется конструктор копирования.
  • Если новый объект не нужно создавать до

Пример для оператора присваивания:

Base obj1(5); //calls Base class constructor
Base obj2; //calls Base class default constructor
obj2 = obj1; //calls assignment operator

Пример для конструктора копирования:

Base obj1(5);
Base obj2 = obj1; //calls copy constructor
25
ответ дан user207421 16 August 2018 в 02:38
поделиться
  • 1
    Было бы справедливым сказать, что оператор присваивания эффективно объединяет уничтожение старого объекта с созданием нового, но с условием, что (1) если один из шагов разрушения старого объекта будет отменен один из шагов в построении нового, обе стадии могут быть опущены; (2) Операторы присваивания не должны делать плохие вещи, если объект присваивается самому себе. – supercat 23 July 2013 в 23:28
Другие вопросы по тегам:

Похожие вопросы: