Требуются два конструктора, потому что вы можете передать NULL
в MyClass::MyClass(const std::string &arg)
. Предоставление второго конструктора спасает вас от глупой аварии.
Например, вы пишете конструктор для вашего класса и заставляете его принимать const std::string &
, чтобы вам не нужно было проверять правильность указателей, если вы используете const char*
.
И везде в вашем коде вы просто используете std::string
s. В какой-то момент вы (или другой программист) передаете туда const char*
. Вот замечательная часть std::string
- у нее есть конструктор, который принимает char*
, и это очень хорошо, за исключением того, что std::string a_string(NULL)
компилируется без проблем, просто не работает.
Вот тут вам пригодится второй конструктор, как вы показали:
MyClass::MyClass(const char* arg)
: m_string(arg ? arg : "")
{}
и он создаст действительный std::string
объект, если вы передадите ему NULL
.
В этом случае я не думаю, что вам нужно беспокоиться о скорости. Вы можете попробовать измерить, хотя, боюсь, вы будете удивлены, насколько малой будет разница (если есть).
РЕДАКТИРОВАТЬ: Только что попробовал std::string a_string(NULL);
, прекрасно компилируется, и вот что происходит, когда он запускается на моей машине (OS X + gcc 4.2.1) (я помню, я пытался это на Windows некоторое время назад, результат был очень похоже, если не совсем то же самое):
std::logic_error: basic_string::_S_construct NULL not valid