Para essas classes simples abaixo. Para MyClass
, o construtor inicializa str
com s
durante a construção usando a lista de inicializadores.
Isso significa que ele str
não será construído até que mc
aconteça?
E no caso de MyClass2
e mc2
?
#include <string>
class MyClass
{
public:
MyClass(std::string s): str(s){}
private:
std::string str;
};
class MyClass2
{
public:
MyClass2(std::string s){str = s;}
private:
std::string str;
};
int main()
{
std::string s = "Hello";
MyClass mc(s);
MyClass2 mc2(s);
}
Todas as construções de membros acontecem entre o
":"
e o"{"
. Uma vez que você entra dentro do{...}
escopo, tudo já foi construído.Então, no seu primeiro exemplo,
str(s)
na verdade é uma chamada para o construtor de cópia destd::string
.No segundo exemplo, a construção ainda acontece lá, mas como você não especificou nada, o construtor padrão de string é chamado. No caso particular de string, isso significa que ele é inicializado para a string vazia. Uma vez que você entra no escopo do construtor, você está atribuindo
s
astr
, sobrescrevendo a inicialização. Então, um pouco de desperdício.