Sua tentativa de reformular está incorreta.
Embora um construtor se pareça com uma função de membro com um nome igual ao nome da classe, o fato é que um construtor realmente não tem um nome. Isso é explicitamente declarado no padrão C ++ (seção [class.ctor] / 1):
Construtores não têm nomes.
Tanto quanto: "Eu acho que um construtor pode ser visto e usado como uma função independente" vai ... bem, eu não tenho muita certeza do que você quer dizer. Uma função livre certamente não pode ser um construtor - um construtor deve ser um membro de uma classe. Ao mesmo tempo, você certamente pode definir uma função livre que cria um objeto e retorna uma instância desse objeto. Essa função livre pode até (mais ou menos) ter o mesmo nome que o tipo de objeto que ela cria, se você desejar o suficiente. Por exemplo, você pode definir a classe dentro de um espaço para nome e, em seguida, definir uma função fora do espaço para nome:
namespace foo {
class bar {};
}
foo::bar bar() { return foo::bar(); }
Esse não é realmente o mesmo nome (a função é justa bar
e a classe é foo::bar
), mas, dependendo do seu ponto de vista, você pode vê-los dessa maneira.
Essa função livre não teria as outras características principais de um construtor. A invocação de um construtor pode ser completamente implícita. Por exemplo, se eu tiver uma classe como:
class foo {
public:
foo (int) {}
foo operator+(foo const &other) {}
};
... então codifique como:
foo f(1);
foo h(0);
h = f + 1;
... pode criar um objeto foo temporário a partir do qual 1
ele pode passar esse objeto foo foo::operator+
. Isso simplesmente não acontecerá com uma função livre, mesmo se essa função livre tiver sido definida para pegar o tipo de parâmetro correto e retornar o tipo de resultado necessário. Para uma conversão implícita, é necessário um construtor.