В C++ конструктора только с одним обязательным параметром считают неявной функцией преобразования. Это преобразовывает тип параметра в тип класса. Является ли это хорошей вещью или не зависит от семантики конструктора.
, Например, если у Вас есть строковый класс с конструктором String(const char* s)
, это, вероятно, точно, что Вы хотите. Можно передать const char*
функции, ожидая String
, и компилятор автоматически создаст временный файл String
объект для Вас.
, С другой стороны, если у Вас есть буферный класс, конструктор которого Buffer(int size)
берет размер буфера в байтах, Вы, вероятно, не хотите, чтобы компилятор бесшумно превратил int
с в Buffer
с. Для предотвращения этого Вы объявляете конструктора с explicit
ключевое слово:
class Buffer { explicit Buffer(int size); ... }
Тот путь,
void useBuffer(Buffer& buf);
useBuffer(4);
становится ошибкой времени компиляции. Если Вы хотите передать временный файл Buffer
объект, необходимо сделать так явно:
useBuffer(Buffer(4));
, Таким образом, если Ваш конструктор единственного параметра преобразовывает параметр в объект Вашего класса, Вы, вероятно, не хотите использовать explicit
ключевое слово. Но если у Вас есть конструктор, который просто, оказывается, берет единственный параметр, необходимо объявить, что это как [1 113] препятствует тому, чтобы компилятор удивил Вас неожиданными преобразованиями.
namespace foo=bar;
Это не влияет ни на какие правила поиска имени. Единственный эффект - сделать foo псевдонимом bar. например:
namespace bar
{
void b();
}
void f () {
bar::b (); // Call 'b' in bar
foo::b (); // 'foo' is an alias to 'bar' so calls same function
}
Следующее изменяет правила поиска
namespace NS
{
namespace bar
{
}
namespace foo {
using namespace bar;
void f () {
++i;
}
}
}
Когда выполняется поиск для «i», сначала будет выполняться поиск «foo», затем «NS», затем «bar».
Поскольку вы импортируете пространство имен в другое, то да, в этом отношении оно должно быть равным. Однако второй вариант также позволяет размещать в нем другой код, поэтому вы также можете помещать в него вещи, которые являются не частью пространства имен foo. Первый просто создает псевдоним.