Regras para declarar construtores
Um construtor tem o mesmo nome de sua classe. Qualquer número de construtores pode ser declarado, sujeito às regras de funções sobrecarregadas. (Para obter mais informações, consulte Sobrecarga.)
class-name ( argument-declaration-list )
Comentários
A argument-declaration-list pode ficar em branco.
O C++ define dois tipos especiais dos construtores, os construtores padrão e de cópia, descritos na tabela a seguir.
Construtores padrão e de cópia
Tipo de construção |
Argumentos |
Finalidade |
---|---|---|
Construtor padrão |
Pode ser chamado sem argumentos |
Construir um objeto padrão do tipo de classe |
Construtor de cópia |
Pode aceitar um único argumento de referência ao mesmo tipo de classe |
Copiar objetos do tipo de classe |
Os construtores padrão podem ser chamados sem argumentos. No entanto, você pode declarar um construtor padrão com uma lista de argumentos, desde que todos os argumentos tenham opções. Da mesma forma, os construtores de cópia devem aceitar um único argumento de referência ao mesmo tipo de classe. Mais argumentos podem ser fornecidos, contanto que todos os argumentos subsequentes tenham opções.
Se você não fornecer construtores, o compilador tentará gerar um construtor padrão. Se você não fornecer um construtor de cópia, o compilador tentará gerar um. Esses construtores gerados pelo compilador são considerados funções de membro públicas. Um erro será gerado se você especificar um construtor de cópia com um primeiro argumento que é um objeto e não uma referência.
Um construtor padrão gerado pelo compilador configura o objeto (inicializa vftables e vbtables, como descrito anteriormente), e ele chama os construtores padrão para classes base e membros, mas não executa nenhuma outra ação. Os construtores de classe base e de membro são chamados somente se existirem, forem acessíveis e não ambíguos.
Um construtor de cópia gerado pelo compilador configura um novo objeto e executa uma cópia de membro do conteúdo do objeto a ser copiado. Se os construtores de classe base ou de membro existirem, eles serão chamados; caso contrário, a cópia bit a bit será executada.
Se todas as classes de base e membro de uma classe type tiverem construtores de cópia que aceitam um argumento const, o construtor de cópia gerado pelo compilador aceitará um único argumento do tipo const type**&. Caso contrário, o construtor de cópia gerado pelo compilador aceitará um único argumento do tipo type&**.
Você pode usar um construtor para inicializar um objeto const ou volatile, mas o construtor em si não pode ser declarado como const ou volatile. A única classe de armazenamento válida para um construtor é inline; o uso de qualquer outro modificador de classe de armazenamento, incluindo a palavra-chave __declspec, com um construtor causa um erro do compilador.
A convenção de chamada stdcall é usada em funções de membro estáticas e funções globais declaradas com a palavra-chave __stdcall, e que não usam uma lista de argumentos de variáveis. Quando você usa a palavra-chave __stdcall em uma função de membro não estática, como um construtor, o compilador usará a convenção de chamada thiscall.
Os construtores de classes base não são herdados por classes derivadas. Quando um objeto de tipo de classe derivada é criado, é construído a partir dos componentes da classe base; depois passa para os componentes da classe derivada. O compilador usa cada construtor de classe base, pois essa parte do objeto completo é inicializada (exceto nos casos de derivação virtual, conforme descrito em Inicializando classes base).