Первый использует так называемый список инициализации .
Когда вы вводите тело конструктора, все члены классов должны быть созданы (чтобы их можно было использовать). Так что, если у вас есть это:
class Foo
{
public:
Foo()
: str() // this is implicit
{
str = "String.";
}
private:
std::string str;
};
Итак, str
создается, а затем назначается. Лучше было бы:
class Foo
{
public:
Foo()
: str("String.")
{
}
private:
std::string str;
};
Так что str
будет построен напрямую. Это не имеет значения в вашем случае, потому что у указателей нет конструктора.
Обычно считается хорошей практикой использовать список инициализации поверх исполняемого кода в конструкторе. список инициализации должен использоваться для инициализации , конструктор должен использоваться для запуска кода.
Кроме того, зачем использовать указатель на строку? Если вы хотите строку, используйте строку; не указатель на строку. Скорее всего, вы действительно хотите строку.
Подробнее о списках инициализаторов:
Списки инициализаторов имеют больше применений, чем просто инициализация членов класса. Их можно использовать для передачи аргументов в базовые конструкторы:
class Foo
{
public:
Foo(int i) { /* ... */ }
}
class Bar
: public Foo
{
public:
Bar()
: Foo(2) // pass 2 into Foo's constructor.
// There is no other way of doing this.
{
/* ... */
}
};
или постоянные члены:
class Foo
{
public:
Foo()
: pi(3.1415f)
{
pi = 3.1415f; // will not work, pi is const.
}
private:
const float pi;
};
Или ссылки:
class Foo
{
public:
Foo(int& i)
: intRef(i) // intRef refers to the i passed into this constructor
{
intRef = i; // does *not* set intRef to refer to i!
// rather, it sets i as the value of
// the int intRef refers to.
}
private:
int &intRef;
};