В чем разница между явным и неявным заданием на 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
EDIT: я на самом деле только что нашел эту статью, Что делает все это намного яснее... и это поднимает еще один вопрос, Должны ли вы (в общем) отметить конструкторы, принимающие один параметр примитива type-numeric/bool / string-as explicit и оставьте все остальное, как есть (конечно, следите за gotchas, такими как конструкторы, такие как (int, SomeType = SomeType())
?
3 ответов
Они отличаются если класс имеет конструктор с пометкой 'явные'. Тогда один из них не работает.
в противном случае, никакой разницы.
ни один из них не является назначением любого рода - они оба инициализация. Первый использует инициализацию копирования, а второй-прямую инициализацию. (FWIW, я уверен, что никогда раньше не слышал терминов "явное назначение" или "неявное назначение").
Edit: (в основном в ответ на комментарий Натана):
вот исправленная версия кода из вашего комментария:
#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()
, выбросьте свой компилятор и получите тот, который работает (О, и дайте нам знать, какой компилятор так сильно сломан)!
только первое задание. Они оба являются инициализацией.
Edit: на самом деле, я ошибаюсь. Как и назначение.