В чем разница между явным и неявным присваиванием в C ++ - PullRequest
16 голосов
/ 17 июня 2010
int value = 5; // this type of assignment is called an explicit assignment
int value(5); // this type of assignment is called an implicit assignment

В чем разница между ними, если таковые имеются, и в каких случаях различаются явное и неявное присвоение и как?


http://weblogs.asp.net/kennykerr/archive/2004/08/31/Explicit-Constructors.aspx

РЕДАКТИРОВАТЬ: Я на самом деле только что нашел эту статью, которая делает все это намного яснее ... и это поднимает другой вопрос, если вы ( в общем ) пометите конструкторы, принимающие один параметр тип примитива - числовой / bool / string - настолько явный, что остальные остаются такими, как есть (конечно, следите за ошибками, такими как конструкторы, такие как (int, SomeType = SomeType())?

Ответы [ 3 ]

21 голосов
/ 17 июня 2010

Ни одно из них не является назначением любого рода - они оба инициализируются. Первый использует инициализацию копирования, а второй - прямую инициализацию. (FWIW, я почти уверен, что никогда раньше не слышал терминов «явное назначение» или «неявное назначение»).

Редактировать: (В основном в ответ на комментарий Натана):

Вот исправленная версия кода из вашего комментария:

#include <iostream>

struct Foo { 
    Foo() { 
        std::cout << "Foo::ctor()" << std::endl; 
    } 
    Foo(Foo const& copy) { 
        std::cout << "Foo::cctor()" << std::endl; 
    } 
    Foo& operator=(Foo const& copy) { 
        std::cout << "foo::assign()" << std::endl; 
        return *this; 
    } 
};

int main(int, const char**) { 
    Foo f; 
    Foo b(f); 
    Foo x = b;
    return 0; 
}

Результат выполнения этого должен быть:

Foo::ctor()
Foo::cctor()
Foo::cctor()

Если вы запустите его и получите foo::assign(), выбросьте свой компилятор и получите тот, который работает (о, и дайте нам знать, что это за компилятор, который так сильно сломан)!

7 голосов
/ 17 июня 2010

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

В остальном без разницы.

0 голосов
/ 17 июня 2010

Только первое - это задание. Они оба инициализируются.

Редактировать: на самом деле я не прав. Также не присваивание.

...