Каково различие между явным и неявным присвоением в C++

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

Править: Я на самом деле просто нашел эту статью, которая делает все это намного более ясным..., и она поднимает другой вопрос, должны Вы (в целом) отмечать конструкторов, берущих единственный параметр типа примитива - numeric/bool/string - столь же явный и оставлять остальных, как они (конечно, наблюдающий для глюков, таких как конструкторы как (int, SomeType = SomeType())?

16
задан Jake Petroules 16 June 2010 в 23:48
поделиться

3 ответа

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

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

7
ответ дан 30 November 2019 в 21:18
поделиться

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

Edit: на самом деле, я ошибаюсь. Как и назначение.

-1
ответ дан 30 November 2019 в 21:18
поделиться

Ни то, ни другое не является назначением какого-либо типа - они оба инициализируют. Первый использует инициализацию копии, а второй - прямую инициализацию. (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 () , выбросьте свой компилятор и получите тот, который работает (о, и дайте нам знать, что это за компилятор, который так сильно сломан)!

21
ответ дан 30 November 2019 в 21:18
поделиться
Другие вопросы по тегам:

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